@webex/contact-center 3.12.0-next.8 → 3.12.0-task-refactor.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +438 -0
- package/ai-docs/README.md +131 -0
- package/ai-docs/RULES.md +455 -0
- package/ai-docs/patterns/event-driven-patterns.md +485 -0
- package/ai-docs/patterns/testing-patterns.md +480 -0
- package/ai-docs/patterns/typescript-patterns.md +365 -0
- package/ai-docs/templates/README.md +102 -0
- package/ai-docs/templates/documentation/create-agents-md.md +240 -0
- package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
- package/ai-docs/templates/existing-service/bug-fix.md +254 -0
- package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
- package/ai-docs/templates/new-method/00-master.md +80 -0
- package/ai-docs/templates/new-method/01-requirements.md +232 -0
- package/ai-docs/templates/new-method/02-implementation.md +295 -0
- package/ai-docs/templates/new-method/03-tests.md +201 -0
- package/ai-docs/templates/new-method/04-validation.md +141 -0
- package/ai-docs/templates/new-service/00-master.md +109 -0
- package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
- package/ai-docs/templates/new-service/02-code-generation.md +346 -0
- package/ai-docs/templates/new-service/03-integration.md +178 -0
- package/ai-docs/templates/new-service/04-test-generation.md +205 -0
- package/ai-docs/templates/new-service/05-validation.md +145 -0
- package/dist/cc.js +65 -123
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +13 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +26 -13
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +7 -6
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +0 -3
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/config/Util.js +2 -3
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/types.js +16 -14
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js +0 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +79 -55
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +17 -92
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +5 -25
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/types.js.map +1 -1
- package/dist/services/index.js +1 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/task/Task.js +644 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +45 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +556 -532
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +132 -28
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/constants.js +7 -6
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/dialer.js +0 -51
- package/dist/services/task/dialer.js.map +1 -1
- package/dist/services/task/digital/Digital.js +77 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +634 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +366 -0
- package/dist/services/task/state-machine/actions.js.map +1 -0
- package/dist/services/task/state-machine/constants.js +139 -0
- package/dist/services/task/state-machine/constants.js.map +1 -0
- package/dist/services/task/state-machine/guards.js +256 -0
- package/dist/services/task/state-machine/guards.js.map +1 -0
- package/dist/services/task/state-machine/index.js +53 -0
- package/dist/services/task/state-machine/index.js.map +1 -0
- package/dist/services/task/state-machine/types.js +54 -0
- package/dist/services/task/state-machine/types.js.map +1 -0
- package/dist/services/task/state-machine/uiControlsComputer.js +369 -0
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
- package/dist/services/task/taskDataNormalizer.js +99 -0
- package/dist/services/task/taskDataNormalizer.js.map +1 -0
- package/dist/services/task/types.js +157 -18
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1031 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +149 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/types/cc.d.ts +4 -33
- package/dist/types/constants.d.ts +13 -2
- package/dist/types/index.d.ts +11 -5
- package/dist/types/metrics/constants.d.ts +5 -3
- package/dist/types/services/ApiAiAssistant.d.ts +1 -1
- package/dist/types/services/config/types.d.ts +97 -25
- package/dist/types/services/core/Err.d.ts +0 -2
- package/dist/types/services/core/Utils.d.ts +25 -23
- package/dist/types/services/core/aqm-reqs.d.ts +0 -49
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -1
- package/dist/types/services/core/websocket/connection-service.d.ts +0 -1
- package/dist/types/services/core/websocket/types.d.ts +1 -1
- package/dist/types/services/index.d.ts +1 -1
- package/dist/types/services/task/Task.d.ts +146 -0
- package/dist/types/services/task/TaskFactory.d.ts +12 -0
- package/dist/types/services/task/TaskUtils.d.ts +39 -8
- package/dist/types/services/task/constants.d.ts +5 -4
- package/dist/types/services/task/dialer.d.ts +0 -15
- package/dist/types/services/task/digital/Digital.d.ts +22 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +906 -0
- package/dist/types/services/task/state-machine/actions.d.ts +8 -0
- package/dist/types/services/task/state-machine/constants.d.ts +91 -0
- package/dist/types/services/task/state-machine/guards.d.ts +78 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +256 -0
- package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
- package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
- package/dist/types/services/task/types.d.ts +539 -88
- package/dist/types/services/task/voice/Voice.d.ts +183 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/types.d.ts +68 -0
- package/dist/types/webex.d.ts +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +14 -2
- package/dist/webex.js.map +1 -1
- package/package.json +14 -11
- package/src/cc.ts +91 -177
- package/src/constants.ts +13 -2
- package/src/index.ts +14 -5
- package/src/metrics/ai-docs/AGENTS.md +348 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
- package/src/metrics/behavioral-events.ts +28 -14
- package/src/metrics/constants.ts +7 -8
- package/src/services/ApiAiAssistant.ts +2 -4
- package/src/services/agent/ai-docs/AGENTS.md +238 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
- package/src/services/ai-docs/AGENTS.md +384 -0
- package/src/services/config/Util.ts +2 -3
- package/src/services/config/ai-docs/AGENTS.md +253 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
- package/src/services/config/types.ts +108 -20
- package/src/services/constants.ts +0 -1
- package/src/services/core/Err.ts +0 -1
- package/src/services/core/Utils.ts +90 -67
- package/src/services/core/ai-docs/AGENTS.md +379 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +696 -0
- package/src/services/core/aqm-reqs.ts +22 -100
- package/src/services/core/websocket/WebSocketManager.ts +4 -23
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +1 -2
- package/src/services/task/Task.ts +785 -0
- package/src/services/task/TaskFactory.ts +55 -0
- package/src/services/task/TaskManager.ts +567 -633
- package/src/services/task/TaskUtils.ts +175 -31
- package/src/services/task/ai-docs/AGENTS.md +448 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +573 -0
- package/src/services/task/constants.ts +5 -4
- package/src/services/task/dialer.ts +1 -56
- package/src/services/task/digital/Digital.ts +95 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +793 -0
- package/src/services/task/state-machine/actions.ts +409 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
- package/src/services/task/state-machine/constants.ts +150 -0
- package/src/services/task/state-machine/guards.ts +295 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +228 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +529 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +641 -95
- package/src/services/task/voice/Voice.ts +1255 -0
- package/src/services/task/voice/WebRTC.ts +187 -0
- package/src/types.ts +88 -5
- package/src/utils/AGENTS.md +276 -0
- package/src/webex.js +2 -0
- package/test/unit/spec/cc.ts +59 -142
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +17 -0
- package/test/unit/spec/services/config/index.ts +26 -55
- package/test/unit/spec/services/core/Utils.ts +103 -52
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +48 -112
- package/test/unit/spec/services/core/websocket/connection-service.ts +5 -4
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +416 -0
- package/test/unit/spec/services/task/TaskFactory.ts +62 -0
- package/test/unit/spec/services/task/TaskManager.ts +781 -1735
- package/test/unit/spec/services/task/TaskUtils.ts +125 -0
- package/test/unit/spec/services/task/dialer.ts +112 -198
- package/test/unit/spec/services/task/digital/Digital.ts +105 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +473 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +288 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +147 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +587 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +242 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
- package/dist/services/task/index.js +0 -1525
- package/dist/services/task/index.js.map +0 -1
- package/dist/types/services/task/index.d.ts +0 -650
- package/src/services/task/index.ts +0 -1801
- 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":"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","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","emit","type","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","handleIncomingWebCall","call","currentTask","find","t","interaction","mediaType","MEDIA_CHANNEL","TELEPHONY","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","eventPayload","mapEventToTaskStateMachineEvent","AGENT_CONTACT_RESERVED","sendStateMachineEvent","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","ccEvent","mediaResourceId","media","TaskEvent","TASK_INCOMING","taskData","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","state","AGENT_INVITE_FAILED","INVITE_FAILED","AGENT_CONTACT_ASSIGN_FAILED","ASSIGN_FAILED","AGENT_CONTACT_OFFER_RONA","RONA","AGENT_OUTBOUND_FAILED","OUTBOUND_FAILED","CONTACT_RECORDING_STARTED","RECORDING_STARTED","CONTACT_RECORDING_PAUSED","PAUSE_RECORDING","CONTACT_RECORDING_RESUMED","RESUME_RECORDING","AGENT_WRAPPEDUP","WRAPUP_COMPLETE","AGENT_CONSULT_CONFERENCED","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","requestRealTimeTranscripts","eventType","keepalive","normalizeTaskData","wasConsultedTask","Boolean","computeWrapUpRequired","undefined","adjustedPayload","context","handleContactReserved","handleAgentContact","CONTACT_MERGED","handleContactMergedEvent","isConsultedTask","isSecondaryEpDnAgent","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","isAutoAnswering","TaskFactory","createTask","setupTaskListeners","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","Error","snapshot","stateMachineService","getSnapshot","isConsultingFlow","destAgentId","consultDestinationAgentId","destinationType","consultDestinationType","TASK_EVENTS","REGISTER_TASK_LISTENERS","TASK_HYDRATE","TASK_CLEANUP","options","handleTaskCleanup","removeFromCollection","removeTaskFromCollection","cancelAutoWrapupTimer","REMOVE_TASK_FROM_COLLECTION","childInteractionId","TASK_MERGED","LoginOption","BROWSER","WebRTC","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","agentsPendingWrapUp","length","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 {getIsConferenceInProgress, isSecondaryEpDnAgent, shouldAutoAnswerTask} 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 task.emit(payload.type, 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 /**\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 (t) => t.data.interaction.mediaType === MEDIA_CHANNEL.TELEPHONY\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n\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 return {type: TaskEvent.TASK_INCOMING, taskData: payload};\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: payload.interaction?.state !== 'new',\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, reason: payload.reason};\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.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 // 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 task = this.taskCollection[interactionId];\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 default:\n return {task: context.task};\n }\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 // 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 // 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) {\n // remove the child task from collection\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.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = 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 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?.length > 0;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if ((isNew && !(isOutdial && needsWrapUp)) || isSecondaryEpDnAgent(task.data.interaction)) {\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 === false) 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,103 @@
|
|
|
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.
|
|
6
|
+
exports.shouldAutoAnswerTask = exports.isWebRTCCall = exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.isDigitalOutbound = 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
8
|
var _constants = require("../../constants");
|
|
10
|
-
var
|
|
9
|
+
var _types2 = require("../../types");
|
|
10
|
+
var _constants2 = require("./state-machine/constants");
|
|
11
11
|
/* eslint-disable import/prefer-default-export */
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Checks if the customer is still in the call (not left)
|
|
15
|
+
*
|
|
16
|
+
* @param interaction - The interaction object
|
|
17
|
+
* @param interactionId - The main interaction ID
|
|
18
|
+
* @returns true if customer is in the call
|
|
19
|
+
*/
|
|
20
|
+
const getIsCustomerInCall = (interaction, interactionId) => {
|
|
21
|
+
const mainCallMedia = interaction.media[interactionId];
|
|
22
|
+
if (!mainCallMedia?.participants) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return mainCallMedia.participants.some(participantId => {
|
|
26
|
+
const participant = interaction.participants[participantId];
|
|
27
|
+
return participant?.pType === _constants2.PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Gets the count of active agent participants in the conference
|
|
33
|
+
* Excludes Customer, Supervisor, and VVA participant types
|
|
34
|
+
*
|
|
35
|
+
* @param interaction - The interaction object
|
|
36
|
+
* @param interactionId - The main interaction ID
|
|
37
|
+
* @returns Number of active agent participants
|
|
38
|
+
*/
|
|
39
|
+
exports.getIsCustomerInCall = getIsCustomerInCall;
|
|
40
|
+
const getConferenceParticipantsCount = (interaction, interactionId) => {
|
|
41
|
+
const mainCallMedia = interaction.media[interactionId];
|
|
42
|
+
if (!mainCallMedia?.participants) {
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
let count = 0;
|
|
46
|
+
for (const participantId of mainCallMedia.participants) {
|
|
47
|
+
const participant = interaction.participants[participantId];
|
|
48
|
+
if (participant && participant.pType !== _constants2.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants2.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants2.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
|
|
49
|
+
count += 1;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return count;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Determines if a consult is actively in-progress for conference control gating.
|
|
57
|
+
* This is used to disable conference controls (End/Consult) only when a consult leg
|
|
58
|
+
* still exists outside the main call participants.
|
|
59
|
+
*/
|
|
60
|
+
exports.getConferenceParticipantsCount = getConferenceParticipantsCount;
|
|
61
|
+
const getIsConsultInProgressForConferenceControls = (interaction, mainCallId, selfAgentId) => {
|
|
62
|
+
if (!interaction || !mainCallId) return false;
|
|
63
|
+
const mainParticipants = interaction.media?.[mainCallId]?.participants;
|
|
64
|
+
if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;
|
|
65
|
+
const mainSet = new Set(mainParticipants);
|
|
66
|
+
const media = interaction.media;
|
|
67
|
+
if (!media) return false;
|
|
68
|
+
return Object.values(media).some(m => {
|
|
69
|
+
if (!m || m.mType !== 'consult') return false;
|
|
70
|
+
if (!Array.isArray(m.participants) || m.participants.length === 0) return false;
|
|
71
|
+
return m.participants.some(participantId => {
|
|
72
|
+
const p = interaction.participants?.[participantId];
|
|
73
|
+
if (!p || p.hasLeft) return false;
|
|
74
|
+
if (selfAgentId && participantId === selfAgentId) return false;
|
|
75
|
+
const consultLegActive = p.consultState === 'consulting' || p.isConsulted === true || p.currentState === 'consulting';
|
|
76
|
+
return consultLegActive && !mainSet.has(participantId);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
exports.getIsConsultInProgressForConferenceControls = getIsConsultInProgressForConferenceControls;
|
|
81
|
+
const getIsConsultedAgentForControls = (taskData, context, isConsultingState) => {
|
|
82
|
+
return Boolean(taskData?.isConsulted) || isConsultingState && !context.consultInitiator;
|
|
83
|
+
};
|
|
84
|
+
exports.getIsConsultedAgentForControls = getIsConsultedAgentForControls;
|
|
85
|
+
const getServerHoldStateForControls = (context, mainCallId, fallbackTaskData) => {
|
|
86
|
+
const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;
|
|
87
|
+
if (!media) return undefined;
|
|
88
|
+
if (mainCallId && media[mainCallId]) {
|
|
89
|
+
return media[mainCallId].isHold ?? false;
|
|
90
|
+
}
|
|
91
|
+
const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;
|
|
92
|
+
if (!mediaId) return undefined;
|
|
93
|
+
return media[mediaId]?.isHold;
|
|
94
|
+
};
|
|
95
|
+
|
|
13
96
|
/**
|
|
14
97
|
* Determines if the given agent is the primary agent (owner) of the task
|
|
15
98
|
* @param task - The task to check
|
|
16
99
|
* @param agentId - The agent ID to check for primary status
|
|
17
100
|
* @returns true if the agent is the primary agent, false otherwise
|
|
18
101
|
*/
|
|
102
|
+
exports.getServerHoldStateForControls = getServerHoldStateForControls;
|
|
19
103
|
const isPrimary = (task, agentId) => {
|
|
20
104
|
if (!task.data?.interaction?.owner) {
|
|
21
105
|
// Fall back to checking data.agentId when owner is not set
|
|
@@ -35,7 +119,7 @@ const isParticipantInMainInteraction = (task, agentId) => {
|
|
|
35
119
|
if (!task?.data?.interaction?.media) {
|
|
36
120
|
return false;
|
|
37
121
|
}
|
|
38
|
-
return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType ===
|
|
122
|
+
return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType === _constants2.MEDIA_TYPE_MAIN_CALL && mediaObj.participants?.includes(agentId));
|
|
39
123
|
};
|
|
40
124
|
|
|
41
125
|
/**
|
|
@@ -57,23 +141,28 @@ const checkParticipantNotInInteraction = (task, agentId) => {
|
|
|
57
141
|
|
|
58
142
|
/**
|
|
59
143
|
* Determines if a conference is currently in progress based on the number of active agent participants
|
|
60
|
-
* @param
|
|
144
|
+
* @param data - The task data to check for conference status
|
|
61
145
|
* @returns true if there are 2 or more active agent participants in the main call, false otherwise
|
|
146
|
+
*
|
|
147
|
+
* For Agent B (consulted agent), their task's interactionId may be different from the main call.
|
|
148
|
+
* We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.
|
|
62
149
|
*/
|
|
63
150
|
exports.checkParticipantNotInInteraction = checkParticipantNotInInteraction;
|
|
64
151
|
const getIsConferenceInProgress = data => {
|
|
65
|
-
|
|
152
|
+
if (!data.interaction) return false;
|
|
153
|
+
const mainCallId = data.interaction.mainInteractionId || data.interactionId;
|
|
154
|
+
const mediaMainCall = data.interaction.media?.[mainCallId];
|
|
66
155
|
const participantsInMainCall = new Set(mediaMainCall?.participants);
|
|
67
|
-
const
|
|
156
|
+
const {
|
|
157
|
+
participants
|
|
158
|
+
} = data.interaction;
|
|
68
159
|
const agentParticipants = new Set();
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
76
|
-
}
|
|
160
|
+
participantsInMainCall.forEach(participantId => {
|
|
161
|
+
const participant = participants[participantId];
|
|
162
|
+
if (participant && participant.pType !== _constants2.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants2.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants2.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
|
|
163
|
+
agentParticipants.add(participantId);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
77
166
|
return agentParticipants.size >= 2;
|
|
78
167
|
};
|
|
79
168
|
|
|
@@ -94,14 +183,11 @@ const isSecondaryAgent = interaction => {
|
|
|
94
183
|
/**
|
|
95
184
|
* Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.
|
|
96
185
|
* This is specifically for telephony consultations to external numbers/entry points.
|
|
97
|
-
* @param
|
|
186
|
+
* @param interaction - The interaction object
|
|
98
187
|
* @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise
|
|
99
188
|
*/
|
|
100
189
|
exports.isSecondaryAgent = isSecondaryAgent;
|
|
101
190
|
const isSecondaryEpDnAgent = interaction => {
|
|
102
|
-
if (!interaction) {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
191
|
return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);
|
|
106
192
|
};
|
|
107
193
|
|
|
@@ -125,7 +211,7 @@ const isAutoAnswerEnabled = (interaction, agentId) => {
|
|
|
125
211
|
*/
|
|
126
212
|
exports.isAutoAnswerEnabled = isAutoAnswerEnabled;
|
|
127
213
|
const isWebRTCCall = (interaction, loginOption, webRtcEnabled) => {
|
|
128
|
-
return webRtcEnabled && loginOption ===
|
|
214
|
+
return webRtcEnabled && loginOption === _types2.LoginOption.BROWSER && interaction.mediaType === _constants.OUTDIAL_MEDIA_TYPE;
|
|
129
215
|
};
|
|
130
216
|
|
|
131
217
|
/**
|
|
@@ -192,15 +278,33 @@ const shouldAutoAnswerTask = (taskData, agentId, loginOption, webRtcEnabled) =>
|
|
|
192
278
|
};
|
|
193
279
|
|
|
194
280
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* @param
|
|
199
|
-
* @
|
|
281
|
+
* Gets the consult media resource ID for switch-call operations.
|
|
282
|
+
* Searches for the consult media leg in the interaction.
|
|
283
|
+
*
|
|
284
|
+
* @param interaction - The interaction object
|
|
285
|
+
* @param consultMediaResourceId - The consult media resource ID from task data
|
|
286
|
+
* @param agentId - Current agent ID
|
|
287
|
+
* @returns The consult media resource ID or undefined
|
|
200
288
|
*/
|
|
201
289
|
exports.shouldAutoAnswerTask = shouldAutoAnswerTask;
|
|
202
|
-
const
|
|
203
|
-
|
|
290
|
+
const getConsultMediaResourceId = (interaction, consultMediaResourceId, agentId) => {
|
|
291
|
+
// First priority: use consultMediaResourceId from task data if available
|
|
292
|
+
if (consultMediaResourceId) {
|
|
293
|
+
return consultMediaResourceId;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Second priority: search for consult media leg in interaction.media
|
|
297
|
+
if (!interaction?.media || !agentId) {
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Find the consult media leg where this agent is a participant
|
|
302
|
+
for (const [mediaId, media] of Object.entries(interaction.media)) {
|
|
303
|
+
if (media.mType === 'consult' && media.participants?.includes(agentId)) {
|
|
304
|
+
return mediaId;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return undefined;
|
|
204
308
|
};
|
|
205
|
-
exports.
|
|
309
|
+
exports.getConsultMediaResourceId = getConsultMediaResourceId;
|
|
206
310
|
//# sourceMappingURL=TaskUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_types","require","_types2","_constants","_types3","isPrimary","task","agentId","data","interaction","owner","exports","isParticipantInMainInteraction","media","Object","values","some","mediaObj","mType","participants","includes","checkParticipantNotInInteraction","hasLeft","getIsConferenceInProgress","mediaMainCall","interactionId","participantsInMainCall","Set","agentParticipants","size","forEach","participantId","participant","pType","add","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","type","OUTDIAL_DIRECTION","outboundType","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","taskData","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","length","isCampaignPreviewReservation","CC_EVENTS","AGENT_OFFER_CAMPAIGN_RESERVATION"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {CC_EVENTS} from '../config/types';\nimport {OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE, OUTBOUND_TYPE} from '../../constants';\nimport {LoginOption} from '../../types';\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param TaskData - The payLoad data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n const mediaMainCall = data.interaction.media?.[data?.interactionId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const participants = data.interaction.participants;\n\n const agentParticipants = new Set();\n if (participantsInMainCall.size > 0) {\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants?.[participantId];\n if (\n participant &&\n participant.pType !== 'Customer' &&\n participant.pType !== 'Supervisor' &&\n !participant.hasLeft &&\n participant.pType !== 'VVA'\n ) {\n agentParticipants.add(participantId);\n }\n });\n }\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n if (!interaction) {\n return false;\n }\n\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\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 taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Checks if a task is a campaign preview reservation that has not yet been accepted.\n * Campaign preview tasks should not trigger incoming call handling until the agent\n * explicitly accepts the preview contact.\n * @param task - The task to check\n * @returns true if the task is a pending campaign preview reservation, false otherwise\n */\nexport const isCampaignPreviewReservation = (task: ITask): boolean => {\n return task?.data?.type === CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_types","require","_constants","_types2","_constants2","getIsCustomerInCall","interaction","interactionId","mainCallMedia","media","participants","some","participantId","participant","pType","PARTICIPANT_TYPE","CUSTOMER","hasLeft","exports","getConferenceParticipantsCount","count","SUPERVISOR","VVA","getIsConsultInProgressForConferenceControls","mainCallId","selfAgentId","mainParticipants","Array","isArray","length","mainSet","Set","Object","values","m","mType","p","consultLegActive","consultState","isConsulted","currentState","has","getIsConsultedAgentForControls","taskData","context","isConsultingState","Boolean","consultInitiator","getServerHoldStateForControls","fallbackTaskData","undefined","isHold","mediaId","mediaResourceId","isPrimary","task","agentId","data","owner","isParticipantInMainInteraction","mediaObj","MEDIA_TYPE_MAIN_CALL","includes","checkParticipantNotInInteraction","getIsConferenceInProgress","mainInteractionId","mediaMainCall","participantsInMainCall","agentParticipants","forEach","add","size","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","type","OUTDIAL_DIRECTION","outboundType","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","getConsultMediaResourceId","consultMediaResourceId","entries"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE, OUTBOUND_TYPE} from '../../constants';\nimport {LoginOption} from '../../types';\nimport {PARTICIPANT_TYPE, MEDIA_TYPE_MAIN_CALL} from './state-machine/constants';\nimport {TaskContext} from './state-machine/types';\n\n/**\n * Checks if the customer is still in the call (not left)\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns true if customer is in the call\n */\nexport const getIsCustomerInCall = (interaction: Interaction, interactionId: string): boolean => {\n const mainCallMedia = interaction.media[interactionId];\n if (!mainCallMedia?.participants) {\n return false;\n }\n\n return mainCallMedia.participants.some((participantId: string) => {\n const participant = interaction.participants[participantId];\n\n return participant?.pType === PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;\n });\n};\n\n/**\n * Gets the count of active agent participants in the conference\n * Excludes Customer, Supervisor, and VVA participant types\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns Number of active agent participants\n */\nexport const getConferenceParticipantsCount = (\n interaction: Interaction,\n interactionId: string\n): number => {\n const mainCallMedia = interaction.media[interactionId];\n if (!mainCallMedia?.participants) {\n return 0;\n }\n\n let count = 0;\n for (const participantId of mainCallMedia.participants) {\n const participant = interaction.participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n count += 1;\n }\n }\n\n return count;\n};\n\n/**\n * Determines if a consult is actively in-progress for conference control gating.\n * This is used to disable conference controls (End/Consult) only when a consult leg\n * still exists outside the main call participants.\n */\nexport const getIsConsultInProgressForConferenceControls = (\n interaction: Interaction | undefined,\n mainCallId: string | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!interaction || !mainCallId) return false;\n\n const mainParticipants = interaction.media?.[mainCallId]?.participants;\n if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;\n\n const mainSet = new Set(mainParticipants);\n const media = interaction.media;\n if (!media) return false;\n\n return Object.values(media).some((m: any) => {\n if (!m || m.mType !== 'consult') return false;\n if (!Array.isArray(m.participants) || m.participants.length === 0) return false;\n\n return m.participants.some((participantId: string) => {\n const p: any = interaction.participants?.[participantId];\n if (!p || p.hasLeft) return false;\n if (selfAgentId && participantId === selfAgentId) return false;\n\n const consultLegActive =\n p.consultState === 'consulting' ||\n p.isConsulted === true ||\n p.currentState === 'consulting';\n\n return consultLegActive && !mainSet.has(participantId);\n });\n });\n};\n\nexport const getIsConsultedAgentForControls = (\n taskData: TaskData | null,\n context: TaskContext,\n isConsultingState: boolean\n): boolean => {\n return Boolean(taskData?.isConsulted) || (isConsultingState && !context.consultInitiator);\n};\n\nexport const getServerHoldStateForControls = (\n context: TaskContext,\n mainCallId?: string,\n fallbackTaskData?: TaskData | null\n): boolean | undefined => {\n const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;\n if (!media) return undefined;\n\n if (mainCallId && media[mainCallId]) {\n return media[mainCallId].isHold ?? false;\n }\n\n const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;\n if (!mediaId) return undefined;\n\n return media[mediaId]?.isHold;\n};\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj &&\n mediaObj.mType === MEDIA_TYPE_MAIN_CALL &&\n mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param data - The task data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n *\n * For Agent B (consulted agent), their task's interactionId may be different from the main call.\n * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n if (!data.interaction) return false;\n\n const mainCallId = data.interaction.mainInteractionId || data.interactionId;\n const mediaMainCall = data.interaction.media?.[mainCallId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const {participants} = data.interaction;\n\n const agentParticipants = new Set();\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n agentParticipants.add(participantId);\n }\n });\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param interaction - The interaction object\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\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 taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Gets the consult media resource ID for switch-call operations.\n * Searches for the consult media leg in the interaction.\n *\n * @param interaction - The interaction object\n * @param consultMediaResourceId - The consult media resource ID from task data\n * @param agentId - Current agent ID\n * @returns The consult media resource ID or undefined\n */\nexport const getConsultMediaResourceId = (\n interaction: Interaction | undefined,\n consultMediaResourceId: string | undefined,\n agentId: string | undefined\n): string | undefined => {\n // First priority: use consultMediaResourceId from task data if available\n if (consultMediaResourceId) {\n return consultMediaResourceId;\n }\n\n // Second priority: search for consult media leg in interaction.media\n if (!interaction?.media || !agentId) {\n return undefined;\n }\n\n // Find the consult media leg where this agent is a participant\n for (const [mediaId, media] of Object.entries(interaction.media)) {\n if (media.mType === 'consult' && media.participants?.includes(agentId)) {\n return mediaId;\n }\n }\n\n return undefined;\n};\n"],"mappings":"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","ignoreList":[]}
|