@webex/contact-center 3.12.0-task-refactor.7 → 3.12.0-task-refactor.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cc.js +3 -4
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/metrics/constants.js +2 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +74 -3
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/config/types.js +9 -1
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/task/Task.js +32 -0
- package/dist/services/task/Task.js.map +1 -1
- package/dist/services/task/TaskManager.js +7 -2
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +3 -1
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/state-machine/TaskStateMachine.js +76 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
- package/dist/services/task/state-machine/actions.js +113 -23
- package/dist/services/task/state-machine/actions.js.map +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js +99 -21
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/metrics/constants.d.ts +2 -0
- package/dist/types/services/ApiAiAssistant.d.ts +10 -2
- package/dist/types/services/config/types.d.ts +16 -0
- package/dist/types/services/task/Task.d.ts +10 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +110 -0
- package/dist/types/services/task/state-machine/actions.d.ts +2 -0
- package/dist/types/types.d.ts +24 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +1 -1
- package/package.json +1 -1
- package/src/cc.ts +6 -4
- package/src/constants.ts +1 -0
- package/src/metrics/constants.ts +2 -0
- package/src/services/ApiAiAssistant.ts +102 -2
- package/src/services/config/types.ts +8 -0
- package/src/services/task/Task.ts +34 -0
- package/src/services/task/TaskManager.ts +7 -2
- package/src/services/task/TaskUtils.ts +5 -3
- package/src/services/task/ai-docs/AGENTS.md +7 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +12 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +104 -0
- package/src/services/task/state-machine/actions.ts +151 -25
- package/src/services/task/state-machine/uiControlsComputer.ts +173 -30
- package/src/types.ts +25 -0
- package/test/unit/spec/cc.ts +2 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +105 -17
- package/test/unit/spec/services/task/Task.ts +61 -0
- package/test/unit/spec/services/task/TaskManager.ts +42 -0
- package/test/unit/spec/services/task/TaskUtils.ts +65 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +676 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +597 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +99 -106
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","require","_xstate","_types","_constants","_constants2","_Utils","_MetricsManager","_interopRequireDefault","_constants3","_loggerProxy","_stateMachine","_uiControlsComputer","_AutoWrapup","e","__esModule","default","Task","EventEmitter","constructor","contact","data","uiControlConfig","wrapupData","agentId","channelType","resolveChannelType","metricsManager","MetricsManager","getInstance","webCallMap","currentUiControls","getDefaultUIControls","initializeStateMachine","setupAutoWrapupTimer","mediaType","interaction","MEDIA_CHANNEL","TELEPHONY","TASK_CHANNEL_TYPE","VOICE","DIGITAL","decline","unsupportedMethodError","pauseRecording","resumeRecording","resumeRecordingPayload","consult","consultPayload","endConsult","consultEndPayload","consultTransfer","consultTransferPayload","consultConference","exitConference","transferConference","switchCall","toggleMute","unregisterWebCallListeners","LoggerProxy","log","module","CC_FILE","method","interactionId","cancelAutoWrapupTimer","autoWrapup","clear","undefined","hold","resume","holdResume","uiControls","updateUiControls","forceEmit","nextControls","computeUIControls","shouldEmit","haveUIControlsChanged","emit","TASK_EVENTS","TASK_UI_CONTROLS_UPDATED","machine","createTaskStateMachine","actions","getStateMachineActionOverrides","stateMachineService","createActor","subscribe","snapshot","previousState","lastState","currentState","value","eventType","event","type","state","start","sendStateMachineEvent","send","getCurrentState","getSnapshot","context","stopStateMachine","stop","extractTaskDataFromEvent","taskData","autoAnswerIfNeeded","autoAnswerSupported","voiceVariant","VOICE_VARIANT","WEBRTC","shouldAutoAnswer","isAutoAnswering","info","TASK_FILE","accept","trackEvent","METRIC_EVENT_NAMES","TASK_AUTO_ANSWER_SUCCESS","taskId","isAutoAnswered","TASK_AUTO_ANSWERED","error","updateTaskData","TASK_AUTO_ANSWER_FAILED","message","updateTaskFromEvent","getCommonActionOverrides","getChannelSpecificActionOverrides","createEmitSelfAction","taskEvent","syncTaskDataFromEvent","emitTaskIncoming","TASK_INCOMING","emitTaskHydrate","TASK_HYDRATE","emitTaskOfferContact","TASK_OFFER_CONTACT","emitTaskAssigned","TASK_ASSIGNED","emitTaskEnd","TASK_END","emitTaskOfferConsult","TASK_OFFER_CONSULT","emitTaskConsultCreated","TASK_CONSULT_CREATED","emitTaskConsulting","isConsulted","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","emitTaskConsultAccepted","emitTaskConsultEnd","TASK_CONSULT_END","emitTaskConsultQueueCancelled","TASK_CONSULT_QUEUE_CANCELLED","emitTaskConsultQueueFailed","TASK_CONSULT_QUEUE_FAILED","emitTaskReject","reason","TASK_REJECT","emitTaskWrapup","shouldEmitWrapup","Boolean","wrapUpRequired","TASK_WRAPUP","emitTaskWrappedup","TASK_WRAPPEDUP","requestAutoAnswer","requestCleanup","TASK_CLEANUP","removeFromCollection","cleanupResources","wrapUpProps","METHODS","SETUP_AUTO_WRAPUP_TIMER","defaultWrapupReason","wrapUpReasonList","find","r","isDefault","intervalMs","autoWrapupInterval","AutoWrapup","allowCancelAutoWrapup","wrapup","wrapUpReason","name","auxCodeId","id","reconcileData","oldData","newData","Object","keys","forEach","key","Array","isArray","methodName","Error","updatedData","shouldOverwrite","transfer","transferPayload","timeEvent","TASK_TRANSFER_SUCCESS","TASK_TRANSFER_FAILED","result","destinationType","DESTINATION_TYPE","QUEUE","vteamTransfer","blindTransfer","destination","to","isConsultTransfer","getCommonTrackingFieldForAQMResponse","detailedError","getErrorDetails","toString","getCommonTrackingFieldForAQMResponseFailed","details","end","requestInteractionId","mainInteractionId","TASK_END_SUCCESS","TASK_END_FAILED","response","wrapupPayload","TASK_WRAPUP_SUCCESS","TASK_WRAPUP_FAILED","length","wrapUpCode","exports"],"sources":["Task.ts"],"sourcesContent":["import {EventEmitter} from 'events';\nimport {createActor} from 'xstate';\nimport type {ActorRefFrom, SnapshotFrom} from 'xstate';\nimport {\n ITask,\n TaskData,\n TaskResponse,\n WrapupPayLoad,\n TaskId,\n TransferPayLoad,\n DESTINATION_TYPE,\n TASK_EVENTS,\n TaskUIControls,\n ConsultEndPayload,\n ConsultPayload,\n ConsultTransferPayLoad,\n ResumeRecordingPayload,\n MEDIA_CHANNEL,\n TASK_CHANNEL_TYPE,\n VOICE_VARIANT,\n CallId,\n} from './types';\nimport {METHODS} from './constants';\nimport {CC_FILE, TASK_FILE} from '../../constants';\nimport {getErrorDetails} from '../core/Utils';\nimport routingContact from './contact';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport LoggerProxy from '../../logger-proxy';\nimport {createTaskStateMachine, TaskState} from './state-machine';\nimport type {\n TaskEventPayload,\n TaskStateMachine,\n UIControlConfig,\n TaskContext,\n TaskActionsMap,\n TaskActionArgs,\n} from './state-machine';\nimport {\n computeUIControls,\n getDefaultUIControls,\n haveUIControlsChanged,\n} from './state-machine/uiControlsComputer';\nimport AutoWrapup from './AutoWrapup';\nimport {WrapupData} from '../config/types';\n\ntype UIControlConfigInput = Omit<UIControlConfig, 'channelType'> & {\n channelType?: UIControlConfig['channelType'];\n};\n\nexport default abstract class Task extends EventEmitter implements ITask {\n protected contact: ReturnType<typeof routingContact>;\n protected metricsManager: MetricsManager;\n public stateMachineService?: ActorRefFrom<TaskStateMachine>;\n public data: TaskData;\n public webCallMap: Record<TaskId, CallId>;\n public state?: SnapshotFrom<TaskStateMachine>;\n private lastState?: TaskState;\n protected currentUiControls: TaskUIControls;\n protected uiControlConfig: UIControlConfig;\n protected wrapupData?: WrapupData;\n public autoWrapup?: AutoWrapup;\n protected agentId?: string;\n\n constructor(\n contact: ReturnType<typeof routingContact>,\n data: TaskData,\n uiControlConfig: UIControlConfigInput,\n wrapupData?: WrapupData,\n agentId?: string\n ) {\n super();\n this.contact = contact;\n this.data = data;\n const channelType = uiControlConfig.channelType ?? Task.resolveChannelType(data);\n // Include agentId in the config for ownership checks (transfer conference)\n this.uiControlConfig = {...uiControlConfig, channelType, agentId};\n this.wrapupData = wrapupData;\n this.agentId = agentId;\n this.metricsManager = MetricsManager.getInstance();\n this.webCallMap = {};\n this.currentUiControls = getDefaultUIControls();\n this.initializeStateMachine();\n this.setupAutoWrapupTimer();\n }\n\n private static resolveChannelType(data: TaskData): UIControlConfig['channelType'] {\n const mediaType = data?.interaction?.mediaType ?? MEDIA_CHANNEL.TELEPHONY;\n\n return mediaType === MEDIA_CHANNEL.TELEPHONY\n ? TASK_CHANNEL_TYPE.VOICE\n : TASK_CHANNEL_TYPE.DIGITAL;\n }\n\n // Abstract methods that all child classes must implement\n public abstract accept(): Promise<TaskResponse>;\n\n // Voice-specific methods with default implementations that throw errors\n // Voice class will override these with actual implementations\n public async decline(): Promise<TaskResponse> {\n this.unsupportedMethodError('decline');\n }\n\n public async pauseRecording(): Promise<TaskResponse> {\n this.unsupportedMethodError('pauseRecording');\n }\n\n public async resumeRecording(\n resumeRecordingPayload: ResumeRecordingPayload\n ): Promise<TaskResponse> {\n if (resumeRecordingPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('resumeRecording');\n }\n\n public async consult(consultPayload: ConsultPayload): Promise<TaskResponse> {\n if (consultPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('consult');\n }\n\n public async endConsult(consultEndPayload: ConsultEndPayload): Promise<TaskResponse> {\n if (consultEndPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('endConsult');\n }\n\n public async consultTransfer(\n consultTransferPayload?: ConsultTransferPayLoad\n ): Promise<TaskResponse> {\n if (consultTransferPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('consultTransfer');\n }\n\n public async consultConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('consultConference');\n }\n\n public async exitConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('exitConference');\n }\n\n public async transferConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('transferConference');\n }\n\n public async switchCall(): Promise<TaskResponse> {\n this.unsupportedMethodError('switchCall');\n }\n\n public async toggleMute(): Promise<void> {\n this.unsupportedMethodError('toggleMute');\n }\n\n public unregisterWebCallListeners(): void {\n // Default implementation - child classes can override\n LoggerProxy.log('unregisterWebCallListeners called', {\n module: CC_FILE,\n method: 'unregisterWebCallListeners',\n interactionId: this.data?.interactionId,\n });\n }\n\n /**\n * Cancel any in-progress auto wrap-up timer.\n * Base implementation just clears the timer reference so subclasses inherit the behavior.\n */\n public cancelAutoWrapupTimer(): void {\n if (this.autoWrapup) {\n this.autoWrapup.clear();\n this.autoWrapup = undefined;\n LoggerProxy.log('Auto wrap-up timer cancelled', {\n module: CC_FILE,\n method: 'cancelAutoWrapupTimer',\n interactionId: this.data?.interactionId,\n });\n }\n }\n\n // Voice tasks use holdResume(), but provide separate methods for interface compliance\n public async hold(): Promise<TaskResponse> {\n this.unsupportedMethodError('hold');\n }\n\n public async resume(): Promise<TaskResponse> {\n this.unsupportedMethodError('resume');\n }\n\n public async holdResume(): Promise<TaskResponse> {\n this.unsupportedMethodError('holdResume');\n }\n\n /**\n * Latest UI controls derived from state machine state and context.\n */\n public get uiControls(): TaskUIControls {\n return this.currentUiControls;\n }\n\n protected updateUiControls(forceEmit = false): void {\n const nextControls = this.computeUIControls();\n const shouldEmit = forceEmit || haveUIControlsChanged(this.currentUiControls, nextControls);\n this.currentUiControls = nextControls;\n\n if (shouldEmit) {\n this.emit(TASK_EVENTS.TASK_UI_CONTROLS_UPDATED, this.currentUiControls);\n }\n }\n\n /**\n * Initialize the state machine\n */\n private initializeStateMachine(): void {\n const machine: TaskStateMachine = createTaskStateMachine(this.uiControlConfig, {\n actions: this.getStateMachineActionOverrides(),\n });\n\n this.stateMachineService = createActor(machine);\n\n this.stateMachineService.subscribe((snapshot) => {\n const previousState = this.lastState;\n const currentState = snapshot.value as TaskState;\n LoggerProxy.log(`State machine transition: ${previousState || 'N/A'} -> ${currentState}`, {\n module: CC_FILE,\n method: 'onTransition',\n // @ts-ignore - snapshot may include event detail depending on XState version\n eventType: (snapshot as any)?.event?.type,\n });\n this.lastState = currentState;\n this.state = snapshot;\n\n this.updateUiControls(previousState !== currentState);\n });\n\n this.stateMachineService.start();\n this.updateUiControls(true);\n }\n\n /**\n * Send an event to the state machine\n */\n public sendStateMachineEvent(event: TaskEventPayload): void {\n if (this.stateMachineService) {\n LoggerProxy.log(`Sending state machine event: ${event?.type}`, {\n module: CC_FILE,\n method: 'sendStateMachineEvent',\n interactionId: this.data?.interactionId,\n });\n\n this.stateMachineService.send(event);\n }\n }\n\n /**\n * Get the current state machine state\n */\n protected getCurrentState(): TaskState | undefined {\n return this.stateMachineService?.getSnapshot()?.value as TaskState;\n }\n\n /**\n * Compute UI controls based on current state machine state.\n *\n * @returns UI control states for all task actions\n */\n protected computeUIControls(): TaskUIControls {\n const snapshot = this.stateMachineService?.getSnapshot?.();\n\n if (!snapshot) {\n return getDefaultUIControls();\n }\n\n const currentState = snapshot.value as TaskState;\n const context = snapshot.context as TaskContext;\n\n return computeUIControls(currentState, context, this.data);\n }\n\n /**\n * Stop the state machine service\n */\n protected stopStateMachine(): void {\n if (this.stateMachineService) {\n this.stateMachineService.stop();\n this.stateMachineService = undefined;\n }\n }\n\n private static extractTaskDataFromEvent(event?: TaskEventPayload): TaskData | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n\n if ('taskData' in event) {\n return (event as {taskData?: TaskData}).taskData;\n }\n\n return undefined;\n }\n\n private async autoAnswerIfNeeded(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n const autoAnswerSupported =\n this.uiControlConfig.channelType === TASK_CHANNEL_TYPE.DIGITAL ||\n this.uiControlConfig.voiceVariant === VOICE_VARIANT.WEBRTC;\n\n if (!autoAnswerSupported) {\n return;\n }\n\n const shouldAutoAnswer = this.data.isAutoAnswering === true;\n\n if (!shouldAutoAnswer) {\n return;\n }\n\n LoggerProxy.info(`Auto-answering task`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n });\n\n try {\n await this.accept();\n LoggerProxy.info(`Task auto-answered successfully`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_SUCCESS,\n {\n taskId: this.data.interactionId,\n mediaType: this.data.interaction.mediaType,\n isAutoAnswered: true,\n },\n ['behavioral', 'operational']\n );\n\n this.emit(TASK_EVENTS.TASK_AUTO_ANSWERED, this);\n } catch (error) {\n this.updateTaskData({...this.data, isAutoAnswering: false});\n LoggerProxy.error(`Failed to auto-answer task`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n error,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_FAILED,\n {\n taskId: this.data.interactionId,\n mediaType: this.data.interaction.mediaType,\n error: error?.message || 'Unknown error',\n isAutoAnswered: false,\n },\n ['behavioral', 'operational']\n );\n }\n }\n\n private updateTaskFromEvent(event?: TaskEventPayload): void {\n const taskData = Task.extractTaskDataFromEvent(event);\n if (taskData) {\n this.updateTaskData(taskData);\n }\n }\n\n protected getStateMachineActionOverrides(): Partial<TaskActionsMap> {\n return {\n ...this.getCommonActionOverrides(),\n ...this.getChannelSpecificActionOverrides(),\n };\n }\n\n protected getChannelSpecificActionOverrides(): Partial<TaskActionsMap> {\n return {};\n }\n\n protected createEmitSelfAction(\n taskEvent: TASK_EVENTS,\n {updateTaskData = false}: {updateTaskData?: boolean} = {}\n ) {\n return ({event}: TaskActionArgs) => {\n if (updateTaskData) {\n this.updateTaskFromEvent(event);\n }\n LoggerProxy.info(`Emitting task event ${taskEvent}`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n this.emit(taskEvent, this);\n };\n }\n\n private getCommonActionOverrides(): Partial<TaskActionsMap> {\n return {\n syncTaskDataFromEvent: ({event}: {event: TaskEventPayload}) => {\n this.updateTaskFromEvent(event);\n },\n emitTaskIncoming: this.createEmitSelfAction(TASK_EVENTS.TASK_INCOMING, {\n updateTaskData: true,\n }),\n emitTaskHydrate: this.createEmitSelfAction(TASK_EVENTS.TASK_HYDRATE, {\n updateTaskData: true,\n }),\n emitTaskOfferContact: this.createEmitSelfAction(TASK_EVENTS.TASK_OFFER_CONTACT, {\n updateTaskData: true,\n }),\n emitTaskAssigned: this.createEmitSelfAction(TASK_EVENTS.TASK_ASSIGNED, {\n updateTaskData: true,\n }),\n emitTaskEnd: this.createEmitSelfAction(TASK_EVENTS.TASK_END, {updateTaskData: true}),\n emitTaskOfferConsult: this.createEmitSelfAction(TASK_EVENTS.TASK_OFFER_CONSULT, {\n updateTaskData: true,\n }),\n emitTaskConsultCreated: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_CREATED, {\n updateTaskData: true,\n }),\n emitTaskConsulting: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n if (this.data.isConsulted) {\n this.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, this);\n } else {\n this.emit(TASK_EVENTS.TASK_CONSULTING, this);\n }\n },\n emitTaskConsultAccepted: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_ACCEPTED),\n emitTaskConsultEnd: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_END, {\n updateTaskData: true,\n }),\n emitTaskConsultQueueCancelled: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED,\n {\n updateTaskData: true,\n }\n ),\n emitTaskConsultQueueFailed: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, {\n updateTaskData: true,\n }),\n emitTaskReject: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n const reason =\n event && typeof event === 'object' && 'reason' in event\n ? (event as {reason?: string}).reason\n : undefined;\n this.emit(TASK_EVENTS.TASK_REJECT, reason);\n },\n emitTaskWrapup: ({event}: {event?: TaskEventPayload}) => {\n this.updateTaskFromEvent(event);\n\n const shouldEmitWrapup = Boolean(this.data.wrapUpRequired);\n if (!shouldEmitWrapup) {\n LoggerProxy.info(`Skipping task:wrapup event - wrapUpRequired is false`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n\n return;\n }\n LoggerProxy.info(`Emitting task event ${TASK_EVENTS.TASK_WRAPUP}`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_WRAPUP, this);\n },\n emitTaskWrappedup: this.createEmitSelfAction(TASK_EVENTS.TASK_WRAPPEDUP, {\n updateTaskData: true,\n }),\n requestAutoAnswer: ({event}: TaskActionArgs) => {\n if (event) {\n // parameter intentionally unused\n }\n this.autoAnswerIfNeeded();\n },\n requestCleanup: () => {\n this.emit(TASK_EVENTS.TASK_CLEANUP, this, {removeFromCollection: false});\n },\n cleanupResources: () => {\n this.emit(TASK_EVENTS.TASK_CLEANUP, this, {removeFromCollection: true});\n },\n };\n }\n\n /**\n * Sets up the automatic wrap-up timer if wrap-up is required\n */\n protected setupAutoWrapupTimer(): void {\n if (\n this.data.wrapUpRequired &&\n !this.autoWrapup &&\n this.wrapupData &&\n this.wrapupData.wrapUpProps\n ) {\n const wrapUpProps = this.wrapupData.wrapUpProps;\n if (!wrapUpProps || wrapUpProps.autoWrapup === false) {\n LoggerProxy.info(`Auto wrap-up is not required for this task`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n interactionId: this.data.interactionId,\n });\n\n return;\n }\n const defaultWrapupReason =\n wrapUpProps.wrapUpReasonList?.find((r) => r.isDefault) ?? wrapUpProps.wrapUpReasonList?.[0];\n if (!defaultWrapupReason) {\n LoggerProxy.error('No wrap-up reason configured', {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n });\n\n return;\n }\n const intervalMs = wrapUpProps.autoWrapupInterval;\n if (!intervalMs || intervalMs <= 0) {\n LoggerProxy.error(`Invalid auto wrap-up interval: ${intervalMs}`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n });\n\n return;\n }\n this.autoWrapup = new AutoWrapup(intervalMs, wrapUpProps.allowCancelAutoWrapup);\n this.autoWrapup.start(async () => {\n LoggerProxy.info(`Auto wrap-up timer triggered`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n interactionId: this.data.interactionId,\n });\n await this.wrapup({\n wrapUpReason: defaultWrapupReason.name,\n auxCodeId: defaultWrapupReason.id,\n });\n });\n }\n }\n\n /**\n * Cancels the automatic wrap-up timer if it's running\n */\n private reconcileData(oldData: TaskData, newData: TaskData): TaskData {\n Object.keys(newData).forEach((key) => {\n if (newData[key] && typeof newData[key] === 'object' && !Array.isArray(newData[key])) {\n oldData[key] = this.reconcileData({...oldData[key]}, newData[key]);\n } else {\n oldData[key] = newData[key];\n }\n });\n\n return oldData;\n }\n\n /**\n *\n * @param methodName - The name of the method that is unsupported\n * @throws Error\n */\n protected unsupportedMethodError(methodName: string) {\n LoggerProxy.error(`Unsupported operation`, {\n module: 'TASK',\n method: methodName,\n interactionId: this.data?.interactionId,\n });\n throw new Error(`Unsupported operation: ${methodName}`);\n }\n\n /**\n * This method is used to update the task data.\n * @param updatedData - TaskData\n * @param shouldOverwrite - boolean\n * @example\n * ```typescript\n * task.updateTaskData(updatedData, true);\n * ```\n */\n public updateTaskData(updatedData: TaskData, shouldOverwrite = false): ITask {\n this.data = shouldOverwrite ? updatedData : this.reconcileData(this.data, updatedData);\n this.updateUiControls();\n this.setupAutoWrapupTimer();\n\n return this;\n }\n\n /**\n * This is used to blind transfer or vTeam transfer the task\n * @param transferPayload\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * const transferPayload = {\n * to: 'myQueueId',\n * destinationType: 'queue',\n * }\n * task.transfer(transferPayload).then(()=>{}).catch(()=>{});\n * ```\n */\n public async transfer(transferPayload: TransferPayLoad): Promise<TaskResponse> {\n LoggerProxy.log(`Starting task transfer for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'transfer',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_TRANSFER_SUCCESS,\n METRIC_EVENT_NAMES.TASK_TRANSFER_FAILED,\n ]);\n let result: TaskResponse;\n if (transferPayload.destinationType === DESTINATION_TYPE.QUEUE) {\n result = await this.contact.vteamTransfer({\n interactionId: this.data.interactionId,\n data: transferPayload,\n });\n } else {\n result = await this.contact.blindTransfer({\n interactionId: this.data.interactionId,\n data: transferPayload,\n });\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_TRANSFER_SUCCESS,\n {\n taskId: this.data.interactionId,\n destination: transferPayload.to,\n destinationType: transferPayload.destinationType,\n isConsultTransfer: false,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(result),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return result;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'transfer', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_TRANSFER_FAILED,\n {\n taskId: this.data.interactionId,\n destination: transferPayload.to,\n destinationType: transferPayload.destinationType,\n isConsultTransfer: false,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n\n /**\n * This is used to end the task.\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.end().then(()=>{}).catch(()=>{})\n * ```\n */\n public async end(): Promise<TaskResponse> {\n LoggerProxy.log(`Ending task for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'end',\n });\n const requestInteractionId =\n this.data.interaction?.mainInteractionId || this.data.interactionId;\n\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_END_SUCCESS,\n METRIC_EVENT_NAMES.TASK_END_FAILED,\n ]);\n const response = await this.contact.end({interactionId: requestInteractionId});\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_END_SUCCESS,\n {\n taskId: this.data.interactionId,\n requestInteractionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return response;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'end', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_END_FAILED,\n {\n taskId: this.data.interactionId,\n requestInteractionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n\n /**\n * This is used to wrap up the task.\n * @param wrapupPayload - WrapupPayLoad\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.wrapup(wrapupPayload).then(()=>{}).catch(()=>{})\n * ```\n */\n public async wrapup(wrapupPayload: WrapupPayLoad): Promise<TaskResponse> {\n this.cancelAutoWrapupTimer();\n LoggerProxy.log(`Starting task wrapup for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'wrapup',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_WRAPUP_SUCCESS,\n METRIC_EVENT_NAMES.TASK_WRAPUP_FAILED,\n ]);\n if (!this.data) {\n throw new Error('No task data available');\n }\n if (!wrapupPayload.auxCodeId || wrapupPayload.auxCodeId.length === 0) {\n throw new Error('AuxCodeId is required');\n }\n if (!wrapupPayload.wrapUpReason || wrapupPayload.wrapUpReason.length === 0) {\n throw new Error('WrapUpReason is required');\n }\n\n const response = await this.contact.wrapup({\n interactionId: this.data.interactionId,\n data: wrapupPayload,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_WRAPUP_SUCCESS,\n {\n taskId: this.data.interactionId,\n wrapUpCode: wrapupPayload.auxCodeId,\n wrapUpReason: wrapupPayload.wrapUpReason,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return response;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'wrapup', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_WRAPUP_FAILED,\n {\n taskId: this.data.interactionId,\n wrapUpCode: wrapupPayload.auxCodeId,\n wrapUpReason: wrapupPayload.wrapUpReason,\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAmBA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAEA,IAAAM,eAAA,GAAAC,sBAAA,CAAAP,OAAA;AACA,IAAAQ,WAAA,GAAAR,OAAA;AACA,IAAAS,YAAA,GAAAF,sBAAA,CAAAP,OAAA;AACA,IAAAU,aAAA,GAAAV,OAAA;AASA,IAAAW,mBAAA,GAAAX,OAAA;AAKA,IAAAY,WAAA,GAAAL,sBAAA,CAAAP,OAAA;AAAsC,SAAAO,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOvB,MAAeG,IAAI,SAASC,oBAAY,CAAkB;EAcvEC,WAAWA,CACTC,OAA0C,EAC1CC,IAAc,EACdC,eAAqC,EACrCC,UAAuB,EACvBC,OAAgB,EAChB;IACA,KAAK,CAAC,CAAC;IACP,IAAI,CAACJ,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,MAAMI,WAAW,GAAGH,eAAe,CAACG,WAAW,IAAIR,IAAI,CAACS,kBAAkB,CAACL,IAAI,CAAC;IAChF;IACA,IAAI,CAACC,eAAe,GAAG;MAAC,GAAGA,eAAe;MAAEG,WAAW;MAAED;IAAO,CAAC;IACjE,IAAI,CAACD,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACG,cAAc,GAAGC,uBAAc,CAACC,WAAW,CAAC,CAAC;IAClD,IAAI,CAACC,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAACC,iBAAiB,GAAG,IAAAC,wCAAoB,EAAC,CAAC;IAC/C,IAAI,CAACC,sBAAsB,CAAC,CAAC;IAC7B,IAAI,CAACC,oBAAoB,CAAC,CAAC;EAC7B;EAEA,OAAeR,kBAAkBA,CAACL,IAAc,EAAkC;IAChF,MAAMc,SAAS,GAAGd,IAAI,EAAEe,WAAW,EAAED,SAAS,IAAIE,oBAAa,CAACC,SAAS;IAEzE,OAAOH,SAAS,KAAKE,oBAAa,CAACC,SAAS,GACxCC,wBAAiB,CAACC,KAAK,GACvBD,wBAAiB,CAACE,OAAO;EAC/B;;EAEA;;EAGA;EACA;EACA,MAAaC,OAAOA,CAAA,EAA0B;IAC5C,IAAI,CAACC,sBAAsB,CAAC,SAAS,CAAC;EACxC;EAEA,MAAaC,cAAcA,CAAA,EAA0B;IACnD,IAAI,CAACD,sBAAsB,CAAC,gBAAgB,CAAC;EAC/C;EAEA,MAAaE,eAAeA,CAC1BC,sBAA8C,EACvB;IACvB,IAAIA,sBAAsB,EAAE;MAC1B;IAAA;IAEF,IAAI,CAACH,sBAAsB,CAAC,iBAAiB,CAAC;EAChD;EAEA,MAAaI,OAAOA,CAACC,cAA8B,EAAyB;IAC1E,IAAIA,cAAc,EAAE;MAClB;IAAA;IAEF,IAAI,CAACL,sBAAsB,CAAC,SAAS,CAAC;EACxC;EAEA,MAAaM,UAAUA,CAACC,iBAAoC,EAAyB;IACnF,IAAIA,iBAAiB,EAAE;MACrB;IAAA;IAEF,IAAI,CAACP,sBAAsB,CAAC,YAAY,CAAC;EAC3C;EAEA,MAAaQ,eAAeA,CAC1BC,sBAA+C,EACxB;IACvB,IAAIA,sBAAsB,EAAE;MAC1B;IAAA;IAEF,IAAI,CAACT,sBAAsB,CAAC,iBAAiB,CAAC;EAChD;EAEA,MAAaU,iBAAiBA,CAAA,EAA0B;IACtD,IAAI,CAACV,sBAAsB,CAAC,mBAAmB,CAAC;EAClD;EAEA,MAAaW,cAAcA,CAAA,EAA0B;IACnD,IAAI,CAACX,sBAAsB,CAAC,gBAAgB,CAAC;EAC/C;EAEA,MAAaY,kBAAkBA,CAAA,EAA0B;IACvD,IAAI,CAACZ,sBAAsB,CAAC,oBAAoB,CAAC;EACnD;EAEA,MAAaa,UAAUA,CAAA,EAA0B;IAC/C,IAAI,CAACb,sBAAsB,CAAC,YAAY,CAAC;EAC3C;EAEA,MAAac,UAAUA,CAAA,EAAkB;IACvC,IAAI,CAACd,sBAAsB,CAAC,YAAY,CAAC;EAC3C;EAEOe,0BAA0BA,CAAA,EAAS;IACxC;IACAC,oBAAW,CAACC,GAAG,CAAC,mCAAmC,EAAE;MACnDC,MAAM,EAAEC,mBAAO;MACfC,MAAM,EAAE,4BAA4B;MACpCC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;IAC5B,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;EACSC,qBAAqBA,CAAA,EAAS;IACnC,IAAI,IAAI,CAACC,UAAU,EAAE;MACnB,IAAI,CAACA,UAAU,CAACC,KAAK,CAAC,CAAC;MACvB,IAAI,CAACD,UAAU,GAAGE,SAAS;MAC3BT,oBAAW,CAACC,GAAG,CAAC,8BAA8B,EAAE;QAC9CC,MAAM,EAAEC,mBAAO;QACfC,MAAM,EAAE,uBAAuB;QAC/BC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;MAC5B,CAAC,CAAC;IACJ;EACF;;EAEA;EACA,MAAaK,IAAIA,CAAA,EAA0B;IACzC,IAAI,CAAC1B,sBAAsB,CAAC,MAAM,CAAC;EACrC;EAEA,MAAa2B,MAAMA,CAAA,EAA0B;IAC3C,IAAI,CAAC3B,sBAAsB,CAAC,QAAQ,CAAC;EACvC;EAEA,MAAa4B,UAAUA,CAAA,EAA0B;IAC/C,IAAI,CAAC5B,sBAAsB,CAAC,YAAY,CAAC;EAC3C;;EAEA;AACF;AACA;EACE,IAAW6B,UAAUA,CAAA,EAAmB;IACtC,OAAO,IAAI,CAACzC,iBAAiB;EAC/B;EAEU0C,gBAAgBA,CAACC,SAAS,GAAG,KAAK,EAAQ;IAClD,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAAC,CAAC;IAC7C,MAAMC,UAAU,GAAGH,SAAS,IAAI,IAAAI,yCAAqB,EAAC,IAAI,CAAC/C,iBAAiB,EAAE4C,YAAY,CAAC;IAC3F,IAAI,CAAC5C,iBAAiB,GAAG4C,YAAY;IAErC,IAAIE,UAAU,EAAE;MACd,IAAI,CAACE,IAAI,CAACC,kBAAW,CAACC,wBAAwB,EAAE,IAAI,CAAClD,iBAAiB,CAAC;IACzE;EACF;;EAEA;AACF;AACA;EACUE,sBAAsBA,CAAA,EAAS;IACrC,MAAMiD,OAAyB,GAAG,IAAAC,oCAAsB,EAAC,IAAI,CAAC7D,eAAe,EAAE;MAC7E8D,OAAO,EAAE,IAAI,CAACC,8BAA8B,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAI,CAACC,mBAAmB,GAAG,IAAAC,mBAAW,EAACL,OAAO,CAAC;IAE/C,IAAI,CAACI,mBAAmB,CAACE,SAAS,CAAEC,QAAQ,IAAK;MAC/C,MAAMC,aAAa,GAAG,IAAI,CAACC,SAAS;MACpC,MAAMC,YAAY,GAAGH,QAAQ,CAACI,KAAkB;MAChDlC,oBAAW,CAACC,GAAG,CAAC,6BAA6B8B,aAAa,IAAI,KAAK,OAAOE,YAAY,EAAE,EAAE;QACxF/B,MAAM,EAAEC,mBAAO;QACfC,MAAM,EAAE,cAAc;QACtB;QACA+B,SAAS,EAAGL,QAAQ,EAAUM,KAAK,EAAEC;MACvC,CAAC,CAAC;MACF,IAAI,CAACL,SAAS,GAAGC,YAAY;MAC7B,IAAI,CAACK,KAAK,GAAGR,QAAQ;MAErB,IAAI,CAAChB,gBAAgB,CAACiB,aAAa,KAAKE,YAAY,CAAC;IACvD,CAAC,CAAC;IAEF,IAAI,CAACN,mBAAmB,CAACY,KAAK,CAAC,CAAC;IAChC,IAAI,CAACzB,gBAAgB,CAAC,IAAI,CAAC;EAC7B;;EAEA;AACF;AACA;EACS0B,qBAAqBA,CAACJ,KAAuB,EAAQ;IAC1D,IAAI,IAAI,CAACT,mBAAmB,EAAE;MAC5B3B,oBAAW,CAACC,GAAG,CAAC,gCAAgCmC,KAAK,EAAEC,IAAI,EAAE,EAAE;QAC7DnC,MAAM,EAAEC,mBAAO;QACfC,MAAM,EAAE,uBAAuB;QAC/BC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;MAC5B,CAAC,CAAC;MAEF,IAAI,CAACsB,mBAAmB,CAACc,IAAI,CAACL,KAAK,CAAC;IACtC;EACF;;EAEA;AACF;AACA;EACYM,eAAeA,CAAA,EAA0B;IACjD,OAAO,IAAI,CAACf,mBAAmB,EAAEgB,WAAW,CAAC,CAAC,EAAET,KAAK;EACvD;;EAEA;AACF;AACA;AACA;AACA;EACYjB,iBAAiBA,CAAA,EAAmB;IAC5C,MAAMa,QAAQ,GAAG,IAAI,CAACH,mBAAmB,EAAEgB,WAAW,GAAG,CAAC;IAE1D,IAAI,CAACb,QAAQ,EAAE;MACb,OAAO,IAAAzD,wCAAoB,EAAC,CAAC;IAC/B;IAEA,MAAM4D,YAAY,GAAGH,QAAQ,CAACI,KAAkB;IAChD,MAAMU,OAAO,GAAGd,QAAQ,CAACc,OAAsB;IAE/C,OAAO,IAAA3B,qCAAiB,EAACgB,YAAY,EAAEW,OAAO,EAAE,IAAI,CAAClF,IAAI,CAAC;EAC5D;;EAEA;AACF;AACA;EACYmF,gBAAgBA,CAAA,EAAS;IACjC,IAAI,IAAI,CAAClB,mBAAmB,EAAE;MAC5B,IAAI,CAACA,mBAAmB,CAACmB,IAAI,CAAC,CAAC;MAC/B,IAAI,CAACnB,mBAAmB,GAAGlB,SAAS;IACtC;EACF;EAEA,OAAesC,wBAAwBA,CAACX,KAAwB,EAAwB;IACtF,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACvC,OAAO3B,SAAS;IAClB;IAEA,IAAI,UAAU,IAAI2B,KAAK,EAAE;MACvB,OAAQA,KAAK,CAA2BY,QAAQ;IAClD;IAEA,OAAOvC,SAAS;EAClB;EAEA,MAAcwC,kBAAkBA,CAAA,EAAkB;IAChD,IAAI,CAAC,IAAI,CAACvF,IAAI,EAAE;MACd;IACF;IAEA,MAAMwF,mBAAmB,GACvB,IAAI,CAACvF,eAAe,CAACG,WAAW,KAAKc,wBAAiB,CAACE,OAAO,IAC9D,IAAI,CAACnB,eAAe,CAACwF,YAAY,KAAKC,oBAAa,CAACC,MAAM;IAE5D,IAAI,CAACH,mBAAmB,EAAE;MACxB;IACF;IAEA,MAAMI,gBAAgB,GAAG,IAAI,CAAC5F,IAAI,CAAC6F,eAAe,KAAK,IAAI;IAE3D,IAAI,CAACD,gBAAgB,EAAE;MACrB;IACF;IAEAtD,oBAAW,CAACwD,IAAI,CAAC,qBAAqB,EAAE;MACtCtD,MAAM,EAAEuD,qBAAS;MACjBrD,MAAM,EAAE,oBAAoB;MAC5BC,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C;IAC3B,CAAC,CAAC;IAEF,IAAI;MACF,MAAM,IAAI,CAACqD,MAAM,CAAC,CAAC;MACnB1D,oBAAW,CAACwD,IAAI,CAAC,iCAAiC,EAAE;QAClDtD,MAAM,EAAEuD,qBAAS;QACjBrD,MAAM,EAAE,oBAAoB;QAC5BC,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C;MAC3B,CAAC,CAAC;MAEF,IAAI,CAACrC,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACC,wBAAwB,EAC3C;QACEC,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/B7B,SAAS,EAAE,IAAI,CAACd,IAAI,CAACe,WAAW,CAACD,SAAS;QAC1CuF,cAAc,EAAE;MAClB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;MAED,IAAI,CAAC3C,IAAI,CAACC,kBAAW,CAAC2C,kBAAkB,EAAE,IAAI,CAAC;IACjD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAI,CAACC,cAAc,CAAC;QAAC,GAAG,IAAI,CAACxG,IAAI;QAAE6F,eAAe,EAAE;MAAK,CAAC,CAAC;MAC3DvD,oBAAW,CAACiE,KAAK,CAAC,4BAA4B,EAAE;QAC9C/D,MAAM,EAAEuD,qBAAS;QACjBrD,MAAM,EAAE,oBAAoB;QAC5BC,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C,aAAa;QACtC4D;MACF,CAAC,CAAC;MAEF,IAAI,CAACjG,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACO,uBAAuB,EAC1C;QACEL,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/B7B,SAAS,EAAE,IAAI,CAACd,IAAI,CAACe,WAAW,CAACD,SAAS;QAC1CyF,KAAK,EAAEA,KAAK,EAAEG,OAAO,IAAI,eAAe;QACxCL,cAAc,EAAE;MAClB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;IACH;EACF;EAEQM,mBAAmBA,CAACjC,KAAwB,EAAQ;IAC1D,MAAMY,QAAQ,GAAG1F,IAAI,CAACyF,wBAAwB,CAACX,KAAK,CAAC;IACrD,IAAIY,QAAQ,EAAE;MACZ,IAAI,CAACkB,cAAc,CAAClB,QAAQ,CAAC;IAC/B;EACF;EAEUtB,8BAA8BA,CAAA,EAA4B;IAClE,OAAO;MACL,GAAG,IAAI,CAAC4C,wBAAwB,CAAC,CAAC;MAClC,GAAG,IAAI,CAACC,iCAAiC,CAAC;IAC5C,CAAC;EACH;EAEUA,iCAAiCA,CAAA,EAA4B;IACrE,OAAO,CAAC,CAAC;EACX;EAEUC,oBAAoBA,CAC5BC,SAAsB,EACtB;IAACP,cAAc,GAAG;EAAiC,CAAC,GAAG,CAAC,CAAC,EACzD;IACA,OAAO,CAAC;MAAC9B;IAAqB,CAAC,KAAK;MAClC,IAAI8B,cAAc,EAAE;QAClB,IAAI,CAACG,mBAAmB,CAACjC,KAAK,CAAC;MACjC;MACApC,oBAAW,CAACwD,IAAI,CAAC,uBAAuBiB,SAAS,EAAE,EAAE;QACnDvE,MAAM,EAAEuD,qBAAS;QACjBrD,MAAM,EAAE,eAAe;QACvBC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;MAC5B,CAAC,CAAC;MACF,IAAI,CAACe,IAAI,CAACqD,SAAS,EAAE,IAAI,CAAC;IAC5B,CAAC;EACH;EAEQH,wBAAwBA,CAAA,EAA4B;IAC1D,OAAO;MACLI,qBAAqB,EAAEA,CAAC;QAACtC;MAAgC,CAAC,KAAK;QAC7D,IAAI,CAACiC,mBAAmB,CAACjC,KAAK,CAAC;MACjC,CAAC;MACDuC,gBAAgB,EAAE,IAAI,CAACH,oBAAoB,CAACnD,kBAAW,CAACuD,aAAa,EAAE;QACrEV,cAAc,EAAE;MAClB,CAAC,CAAC;MACFW,eAAe,EAAE,IAAI,CAACL,oBAAoB,CAACnD,kBAAW,CAACyD,YAAY,EAAE;QACnEZ,cAAc,EAAE;MAClB,CAAC,CAAC;MACFa,oBAAoB,EAAE,IAAI,CAACP,oBAAoB,CAACnD,kBAAW,CAAC2D,kBAAkB,EAAE;QAC9Ed,cAAc,EAAE;MAClB,CAAC,CAAC;MACFe,gBAAgB,EAAE,IAAI,CAACT,oBAAoB,CAACnD,kBAAW,CAAC6D,aAAa,EAAE;QACrEhB,cAAc,EAAE;MAClB,CAAC,CAAC;MACFiB,WAAW,EAAE,IAAI,CAACX,oBAAoB,CAACnD,kBAAW,CAAC+D,QAAQ,EAAE;QAAClB,cAAc,EAAE;MAAI,CAAC,CAAC;MACpFmB,oBAAoB,EAAE,IAAI,CAACb,oBAAoB,CAACnD,kBAAW,CAACiE,kBAAkB,EAAE;QAC9EpB,cAAc,EAAE;MAClB,CAAC,CAAC;MACFqB,sBAAsB,EAAE,IAAI,CAACf,oBAAoB,CAACnD,kBAAW,CAACmE,oBAAoB,EAAE;QAClFtB,cAAc,EAAE;MAClB,CAAC,CAAC;MACFuB,kBAAkB,EAAEA,CAAC;QAACrD;MAAqB,CAAC,KAAK;QAC/C,IAAI,CAACiC,mBAAmB,CAACjC,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC1E,IAAI,CAACgI,WAAW,EAAE;UACzB,IAAI,CAACtE,IAAI,CAACC,kBAAW,CAACsE,qBAAqB,EAAE,IAAI,CAAC;QACpD,CAAC,MAAM;UACL,IAAI,CAACvE,IAAI,CAACC,kBAAW,CAACuE,eAAe,EAAE,IAAI,CAAC;QAC9C;MACF,CAAC;MACDC,uBAAuB,EAAE,IAAI,CAACrB,oBAAoB,CAACnD,kBAAW,CAACsE,qBAAqB,CAAC;MACrFG,kBAAkB,EAAE,IAAI,CAACtB,oBAAoB,CAACnD,kBAAW,CAAC0E,gBAAgB,EAAE;QAC1E7B,cAAc,EAAE;MAClB,CAAC,CAAC;MACF8B,6BAA6B,EAAE,IAAI,CAACxB,oBAAoB,CACtDnD,kBAAW,CAAC4E,4BAA4B,EACxC;QACE/B,cAAc,EAAE;MAClB,CACF,CAAC;MACDgC,0BAA0B,EAAE,IAAI,CAAC1B,oBAAoB,CAACnD,kBAAW,CAAC8E,yBAAyB,EAAE;QAC3FjC,cAAc,EAAE;MAClB,CAAC,CAAC;MACFkC,cAAc,EAAEA,CAAC;QAAChE;MAAqB,CAAC,KAAK;QAC3C,IAAI,CAACiC,mBAAmB,CAACjC,KAAK,CAAC;QAC/B,MAAMiE,MAAM,GACVjE,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAIA,KAAK,GAClDA,KAAK,CAAuBiE,MAAM,GACnC5F,SAAS;QACf,IAAI,CAACW,IAAI,CAACC,kBAAW,CAACiF,WAAW,EAAED,MAAM,CAAC;MAC5C,CAAC;MACDE,cAAc,EAAEA,CAAC;QAACnE;MAAiC,CAAC,KAAK;QACvD,IAAI,CAACiC,mBAAmB,CAACjC,KAAK,CAAC;QAE/B,MAAMoE,gBAAgB,GAAGC,OAAO,CAAC,IAAI,CAAC/I,IAAI,CAACgJ,cAAc,CAAC;QAC1D,IAAI,CAACF,gBAAgB,EAAE;UACrBxG,oBAAW,CAACwD,IAAI,CAAC,sDAAsD,EAAE;YACvEtD,MAAM,EAAEuD,qBAAS;YACjBrD,MAAM,EAAE,eAAe;YACvBC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;UAC5B,CAAC,CAAC;UAEF;QACF;QACAL,oBAAW,CAACwD,IAAI,CAAC,uBAAuBnC,kBAAW,CAACsF,WAAW,EAAE,EAAE;UACjEzG,MAAM,EAAEuD,qBAAS;UACjBrD,MAAM,EAAE,eAAe;UACvBC,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;QAC5B,CAAC,CAAC;QACF,IAAI,CAACe,IAAI,CAACC,kBAAW,CAACsF,WAAW,EAAE,IAAI,CAAC;MAC1C,CAAC;MACDC,iBAAiB,EAAE,IAAI,CAACpC,oBAAoB,CAACnD,kBAAW,CAACwF,cAAc,EAAE;QACvE3C,cAAc,EAAE;MAClB,CAAC,CAAC;MACF4C,iBAAiB,EAAEA,CAAC;QAAC1E;MAAqB,CAAC,KAAK;QAC9C,IAAIA,KAAK,EAAE;UACT;QAAA;QAEF,IAAI,CAACa,kBAAkB,CAAC,CAAC;MAC3B,CAAC;MACD8D,cAAc,EAAEA,CAAA,KAAM;QACpB,IAAI,CAAC3F,IAAI,CAACC,kBAAW,CAAC2F,YAAY,EAAE,IAAI,EAAE;UAACC,oBAAoB,EAAE;QAAK,CAAC,CAAC;MAC1E,CAAC;MACDC,gBAAgB,EAAEA,CAAA,KAAM;QACtB,IAAI,CAAC9F,IAAI,CAACC,kBAAW,CAAC2F,YAAY,EAAE,IAAI,EAAE;UAACC,oBAAoB,EAAE;QAAI,CAAC,CAAC;MACzE;IACF,CAAC;EACH;;EAEA;AACF;AACA;EACY1I,oBAAoBA,CAAA,EAAS;IACrC,IACE,IAAI,CAACb,IAAI,CAACgJ,cAAc,IACxB,CAAC,IAAI,CAACnG,UAAU,IAChB,IAAI,CAAC3C,UAAU,IACf,IAAI,CAACA,UAAU,CAACuJ,WAAW,EAC3B;MACA,MAAMA,WAAW,GAAG,IAAI,CAACvJ,UAAU,CAACuJ,WAAW;MAC/C,IAAI,CAACA,WAAW,IAAIA,WAAW,CAAC5G,UAAU,KAAK,KAAK,EAAE;QACpDP,oBAAW,CAACwD,IAAI,CAAC,4CAA4C,EAAE;UAC7DtD,MAAM,EAAEuD,qBAAS;UACjBrD,MAAM,EAAEgH,kBAAO,CAACC,uBAAuB;UACvChH,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C;QAC3B,CAAC,CAAC;QAEF;MACF;MACA,MAAMiH,mBAAmB,GACvBH,WAAW,CAACI,gBAAgB,EAAEC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,SAAS,CAAC,IAAIP,WAAW,CAACI,gBAAgB,GAAG,CAAC,CAAC;MAC7F,IAAI,CAACD,mBAAmB,EAAE;QACxBtH,oBAAW,CAACiE,KAAK,CAAC,8BAA8B,EAAE;UAChD/D,MAAM,EAAEuD,qBAAS;UACjBrD,MAAM,EAAEgH,kBAAO,CAACC;QAClB,CAAC,CAAC;QAEF;MACF;MACA,MAAMM,UAAU,GAAGR,WAAW,CAACS,kBAAkB;MACjD,IAAI,CAACD,UAAU,IAAIA,UAAU,IAAI,CAAC,EAAE;QAClC3H,oBAAW,CAACiE,KAAK,CAAC,kCAAkC0D,UAAU,EAAE,EAAE;UAChEzH,MAAM,EAAEuD,qBAAS;UACjBrD,MAAM,EAAEgH,kBAAO,CAACC;QAClB,CAAC,CAAC;QAEF;MACF;MACA,IAAI,CAAC9G,UAAU,GAAG,IAAIsH,mBAAU,CAACF,UAAU,EAAER,WAAW,CAACW,qBAAqB,CAAC;MAC/E,IAAI,CAACvH,UAAU,CAACgC,KAAK,CAAC,YAAY;QAChCvC,oBAAW,CAACwD,IAAI,CAAC,8BAA8B,EAAE;UAC/CtD,MAAM,EAAEuD,qBAAS;UACjBrD,MAAM,EAAEgH,kBAAO,CAACC,uBAAuB;UACvChH,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C;QAC3B,CAAC,CAAC;QACF,MAAM,IAAI,CAAC0H,MAAM,CAAC;UAChBC,YAAY,EAAEV,mBAAmB,CAACW,IAAI;UACtCC,SAAS,EAAEZ,mBAAmB,CAACa;QACjC,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ;EACF;;EAEA;AACF;AACA;EACUC,aAAaA,CAACC,OAAiB,EAAEC,OAAiB,EAAY;IACpEC,MAAM,CAACC,IAAI,CAACF,OAAO,CAAC,CAACG,OAAO,CAAEC,GAAG,IAAK;MACpC,IAAIJ,OAAO,CAACI,GAAG,CAAC,IAAI,OAAOJ,OAAO,CAACI,GAAG,CAAC,KAAK,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACN,OAAO,CAACI,GAAG,CAAC,CAAC,EAAE;QACpFL,OAAO,CAACK,GAAG,CAAC,GAAG,IAAI,CAACN,aAAa,CAAC;UAAC,GAAGC,OAAO,CAACK,GAAG;QAAC,CAAC,EAAEJ,OAAO,CAACI,GAAG,CAAC,CAAC;MACpE,CAAC,MAAM;QACLL,OAAO,CAACK,GAAG,CAAC,GAAGJ,OAAO,CAACI,GAAG,CAAC;MAC7B;IACF,CAAC,CAAC;IAEF,OAAOL,OAAO;EAChB;;EAEA;AACF;AACA;AACA;AACA;EACYrJ,sBAAsBA,CAAC6J,UAAkB,EAAE;IACnD7I,oBAAW,CAACiE,KAAK,CAAC,uBAAuB,EAAE;MACzC/D,MAAM,EAAE,MAAM;MACdE,MAAM,EAAEyI,UAAU;MAClBxI,aAAa,EAAE,IAAI,CAAC3C,IAAI,EAAE2C;IAC5B,CAAC,CAAC;IACF,MAAM,IAAIyI,KAAK,CAAC,0BAA0BD,UAAU,EAAE,CAAC;EACzD;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACS3E,cAAcA,CAAC6E,WAAqB,EAAEC,eAAe,GAAG,KAAK,EAAS;IAC3E,IAAI,CAACtL,IAAI,GAAGsL,eAAe,GAAGD,WAAW,GAAG,IAAI,CAACX,aAAa,CAAC,IAAI,CAAC1K,IAAI,EAAEqL,WAAW,CAAC;IACtF,IAAI,CAACjI,gBAAgB,CAAC,CAAC;IACvB,IAAI,CAACvC,oBAAoB,CAAC,CAAC;IAE3B,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAa0K,QAAQA,CAACC,eAAgC,EAAyB;IAC7ElJ,oBAAW,CAACC,GAAG,CAAC,qCAAqC,IAAI,CAACvC,IAAI,CAAC2C,aAAa,EAAE,EAAE;MAC9EH,MAAM,EAAE,MAAM;MACdE,MAAM,EAAE;IACV,CAAC,CAAC;IACF,IAAI;MACF,IAAI,CAACpC,cAAc,CAACmL,SAAS,CAAC,CAC5BvF,8BAAkB,CAACwF,qBAAqB,EACxCxF,8BAAkB,CAACyF,oBAAoB,CACxC,CAAC;MACF,IAAIC,MAAoB;MACxB,IAAIJ,eAAe,CAACK,eAAe,KAAKC,uBAAgB,CAACC,KAAK,EAAE;QAC9DH,MAAM,GAAG,MAAM,IAAI,CAAC7L,OAAO,CAACiM,aAAa,CAAC;UACxCrJ,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C,aAAa;UACtC3C,IAAI,EAAEwL;QACR,CAAC,CAAC;MACJ,CAAC,MAAM;QACLI,MAAM,GAAG,MAAM,IAAI,CAAC7L,OAAO,CAACkM,aAAa,CAAC;UACxCtJ,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C,aAAa;UACtC3C,IAAI,EAAEwL;QACR,CAAC,CAAC;MACJ;MAEA,IAAI,CAAClL,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACwF,qBAAqB,EACxC;QACEtF,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/BuJ,WAAW,EAAEV,eAAe,CAACW,EAAE;QAC/BN,eAAe,EAAEL,eAAe,CAACK,eAAe;QAChDO,iBAAiB,EAAE,KAAK;QACxB,GAAG7L,uBAAc,CAAC8L,oCAAoC,CAACT,MAAM;MAC/D,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MAED,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOrF,KAAK,EAAE;MACd,MAAM;QAACA,KAAK,EAAE+F;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAAChG,KAAK,EAAE,UAAU,EAAE9D,mBAAO,CAAC;MAC1E,IAAI,CAACnC,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACyF,oBAAoB,EACvC;QACEvF,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/BuJ,WAAW,EAAEV,eAAe,CAACW,EAAE;QAC/BN,eAAe,EAAEL,eAAe,CAACK,eAAe;QAChDO,iBAAiB,EAAE,KAAK;QACxB7F,KAAK,EAAEA,KAAK,CAACiG,QAAQ,CAAC,CAAC;QACvB,GAAGjM,uBAAc,CAACkM,0CAA0C,CACzDlG,KAAK,CAASmG,OAAO,IAAI,CAAC,CAC7B;MACF,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MACD,MAAMJ,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaK,GAAGA,CAAA,EAA0B;IACxCrK,oBAAW,CAACC,GAAG,CAAC,0BAA0B,IAAI,CAACvC,IAAI,CAAC2C,aAAa,EAAE,EAAE;MACnEH,MAAM,EAAE,MAAM;MACdE,MAAM,EAAE;IACV,CAAC,CAAC;IACF,MAAMkK,oBAAoB,GACxB,IAAI,CAAC5M,IAAI,CAACe,WAAW,EAAE8L,iBAAiB,IAAI,IAAI,CAAC7M,IAAI,CAAC2C,aAAa;IAErE,IAAI;MACF,IAAI,CAACrC,cAAc,CAACmL,SAAS,CAAC,CAC5BvF,8BAAkB,CAAC4G,gBAAgB,EACnC5G,8BAAkB,CAAC6G,eAAe,CACnC,CAAC;MACF,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACjN,OAAO,CAAC4M,GAAG,CAAC;QAAChK,aAAa,EAAEiK;MAAoB,CAAC,CAAC;MAE9E,IAAI,CAACtM,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAAC4G,gBAAgB,EACnC;QACE1G,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/BiK,oBAAoB;QACpB,GAAGrM,uBAAc,CAAC8L,oCAAoC,CAACW,QAAQ;MACjE,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MAED,OAAOA,QAAQ;IACjB,CAAC,CAAC,OAAOzG,KAAK,EAAE;MACd,MAAM;QAACA,KAAK,EAAE+F;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAAChG,KAAK,EAAE,KAAK,EAAE9D,mBAAO,CAAC;MACrE,IAAI,CAACnC,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAAC6G,eAAe,EAClC;QACE3G,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/BiK,oBAAoB;QACpB,GAAGrM,uBAAc,CAACkM,0CAA0C,CACzDlG,KAAK,CAASmG,OAAO,IAAI,CAAC,CAC7B;MACF,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MACD,MAAMJ,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAajC,MAAMA,CAAC4C,aAA4B,EAAyB;IACvE,IAAI,CAACrK,qBAAqB,CAAC,CAAC;IAC5BN,oBAAW,CAACC,GAAG,CAAC,mCAAmC,IAAI,CAACvC,IAAI,CAAC2C,aAAa,EAAE,EAAE;MAC5EH,MAAM,EAAE,MAAM;MACdE,MAAM,EAAE;IACV,CAAC,CAAC;IACF,IAAI;MACF,IAAI,CAACpC,cAAc,CAACmL,SAAS,CAAC,CAC5BvF,8BAAkB,CAACgH,mBAAmB,EACtChH,8BAAkB,CAACiH,kBAAkB,CACtC,CAAC;MACF,IAAI,CAAC,IAAI,CAACnN,IAAI,EAAE;QACd,MAAM,IAAIoL,KAAK,CAAC,wBAAwB,CAAC;MAC3C;MACA,IAAI,CAAC6B,aAAa,CAACzC,SAAS,IAAIyC,aAAa,CAACzC,SAAS,CAAC4C,MAAM,KAAK,CAAC,EAAE;QACpE,MAAM,IAAIhC,KAAK,CAAC,uBAAuB,CAAC;MAC1C;MACA,IAAI,CAAC6B,aAAa,CAAC3C,YAAY,IAAI2C,aAAa,CAAC3C,YAAY,CAAC8C,MAAM,KAAK,CAAC,EAAE;QAC1E,MAAM,IAAIhC,KAAK,CAAC,0BAA0B,CAAC;MAC7C;MAEA,MAAM4B,QAAQ,GAAG,MAAM,IAAI,CAACjN,OAAO,CAACsK,MAAM,CAAC;QACzC1H,aAAa,EAAE,IAAI,CAAC3C,IAAI,CAAC2C,aAAa;QACtC3C,IAAI,EAAEiN;MACR,CAAC,CAAC;MAEF,IAAI,CAAC3M,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACgH,mBAAmB,EACtC;QACE9G,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/B0K,UAAU,EAAEJ,aAAa,CAACzC,SAAS;QACnCF,YAAY,EAAE2C,aAAa,CAAC3C,YAAY;QACxC,GAAG/J,uBAAc,CAAC8L,oCAAoC,CAACW,QAAQ;MACjE,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MAED,OAAOA,QAAQ;IACjB,CAAC,CAAC,OAAOzG,KAAK,EAAE;MACd,MAAM;QAACA,KAAK,EAAE+F;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAAChG,KAAK,EAAE,QAAQ,EAAE9D,mBAAO,CAAC;MACxE,IAAI,CAACnC,cAAc,CAAC2F,UAAU,CAC5BC,8BAAkB,CAACiH,kBAAkB,EACrC;QACE/G,MAAM,EAAE,IAAI,CAACpG,IAAI,CAAC2C,aAAa;QAC/B0K,UAAU,EAAEJ,aAAa,CAACzC,SAAS;QACnCF,YAAY,EAAE2C,aAAa,CAAC3C,YAAY;QACxC,GAAG/J,uBAAc,CAACkM,0CAA0C,CACzDlG,KAAK,CAASmG,OAAO,IAAI,CAAC,CAC7B;MACF,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MACD,MAAMJ,aAAa;IACrB;EACF;AACF;AAACgB,OAAA,CAAA3N,OAAA,GAAAC,IAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","require","_xstate","_types","_constants","_constants2","_Utils","_MetricsManager","_interopRequireDefault","_constants3","_loggerProxy","_stateMachine","_uiControlsComputer","_AutoWrapup","e","__esModule","default","Task","EventEmitter","constructor","contact","data","uiControlConfig","wrapupData","agentId","channelType","resolveChannelType","metricsManager","MetricsManager","getInstance","webCallMap","currentUiControls","getDefaultUIControls","initializeStateMachine","setupAutoWrapupTimer","mediaType","interaction","MEDIA_CHANNEL","TELEPHONY","TASK_CHANNEL_TYPE","VOICE","DIGITAL","decline","unsupportedMethodError","pauseRecording","resumeRecording","resumeRecordingPayload","consult","consultPayload","endConsult","consultEndPayload","consultTransfer","consultTransferPayload","consultConference","exitConference","transferConference","switchCall","toggleMute","unregisterWebCallListeners","LoggerProxy","log","module","CC_FILE","method","interactionId","cancelAutoWrapupTimer","autoWrapup","clear","undefined","hold","resume","holdResume","uiControls","updateUiControls","forceEmit","nextControls","computeUIControls","shouldEmit","haveUIControlsChanged","emit","TASK_EVENTS","TASK_UI_CONTROLS_UPDATED","machine","createTaskStateMachine","actions","getStateMachineActionOverrides","stateMachineService","createActor","subscribe","snapshot","previousState","lastState","currentState","value","eventType","event","type","state","start","sendStateMachineEvent","send","getCurrentState","getSnapshot","context","stopStateMachine","stop","extractTaskDataFromEvent","taskData","autoAnswerIfNeeded","autoAnswerSupported","voiceVariant","VOICE_VARIANT","WEBRTC","shouldAutoAnswer","isAutoAnswering","info","TASK_FILE","accept","trackEvent","METRIC_EVENT_NAMES","TASK_AUTO_ANSWER_SUCCESS","taskId","isAutoAnswered","TASK_AUTO_ANSWERED","error","updateTaskData","TASK_AUTO_ANSWER_FAILED","message","updateTaskFromEvent","getCommonActionOverrides","getChannelSpecificActionOverrides","createEmitSelfAction","taskEvent","syncTaskDataFromEvent","emitTaskIncoming","TASK_INCOMING","emitTaskHydrate","TASK_HYDRATE","emitTaskOfferContact","TASK_OFFER_CONTACT","emitTaskAssigned","TASK_ASSIGNED","emitTaskEnd","TASK_END","emitTaskOfferConsult","TASK_OFFER_CONSULT","emitTaskConsultCreated","TASK_CONSULT_CREATED","emitTaskConsulting","isConsulted","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","emitTaskConsultAccepted","emitTaskConsultEnd","TASK_CONSULT_END","emitTaskConsultQueueCancelled","TASK_CONSULT_QUEUE_CANCELLED","emitTaskConsultQueueFailed","TASK_CONSULT_QUEUE_FAILED","emitTaskReject","reason","TASK_REJECT","emitTaskWrapup","shouldEmitWrapup","Boolean","wrapUpRequired","TASK_WRAPUP","emitTaskWrappedup","TASK_WRAPPEDUP","requestAutoAnswer","requestCleanup","TASK_CLEANUP","removeFromCollection","cleanupResources","wrapUpProps","METHODS","SETUP_AUTO_WRAPUP_TIMER","defaultWrapupReason","wrapUpReasonList","find","r","isDefault","intervalMs","autoWrapupInterval","AutoWrapup","allowCancelAutoWrapup","wrapup","wrapUpReason","name","auxCodeId","id","reconcileData","oldData","newData","Object","keys","forEach","key","Array","isArray","methodName","Error","updatedData","shouldOverwrite","pruneStaleInteractionMaps","incoming","incomingInteraction","currentInteraction","mapKey","incomingMap","currentMap","transfer","transferPayload","timeEvent","TASK_TRANSFER_SUCCESS","TASK_TRANSFER_FAILED","result","destinationType","DESTINATION_TYPE","QUEUE","vteamTransfer","blindTransfer","destination","to","isConsultTransfer","getCommonTrackingFieldForAQMResponse","detailedError","getErrorDetails","toString","getCommonTrackingFieldForAQMResponseFailed","details","end","requestInteractionId","mainInteractionId","TASK_END_SUCCESS","TASK_END_FAILED","response","wrapupPayload","TASK_WRAPUP_SUCCESS","TASK_WRAPUP_FAILED","length","wrapUpCode","exports"],"sources":["Task.ts"],"sourcesContent":["import {EventEmitter} from 'events';\nimport {createActor} from 'xstate';\nimport type {ActorRefFrom, SnapshotFrom} from 'xstate';\nimport {\n ITask,\n TaskData,\n TaskResponse,\n WrapupPayLoad,\n TaskId,\n TransferPayLoad,\n DESTINATION_TYPE,\n TASK_EVENTS,\n TaskUIControls,\n ConsultEndPayload,\n ConsultPayload,\n ConsultTransferPayLoad,\n ResumeRecordingPayload,\n MEDIA_CHANNEL,\n TASK_CHANNEL_TYPE,\n VOICE_VARIANT,\n CallId,\n} from './types';\nimport {METHODS} from './constants';\nimport {CC_FILE, TASK_FILE} from '../../constants';\nimport {getErrorDetails} from '../core/Utils';\nimport routingContact from './contact';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport LoggerProxy from '../../logger-proxy';\nimport {createTaskStateMachine, TaskState} from './state-machine';\nimport type {\n TaskEventPayload,\n TaskStateMachine,\n UIControlConfig,\n TaskContext,\n TaskActionsMap,\n TaskActionArgs,\n} from './state-machine';\nimport {\n computeUIControls,\n getDefaultUIControls,\n haveUIControlsChanged,\n} from './state-machine/uiControlsComputer';\nimport AutoWrapup from './AutoWrapup';\nimport {WrapupData} from '../config/types';\n\ntype UIControlConfigInput = Omit<UIControlConfig, 'channelType'> & {\n channelType?: UIControlConfig['channelType'];\n};\n\nexport default abstract class Task extends EventEmitter implements ITask {\n protected contact: ReturnType<typeof routingContact>;\n protected metricsManager: MetricsManager;\n public stateMachineService?: ActorRefFrom<TaskStateMachine>;\n public data: TaskData;\n public webCallMap: Record<TaskId, CallId>;\n public state?: SnapshotFrom<TaskStateMachine>;\n private lastState?: TaskState;\n protected currentUiControls: TaskUIControls;\n protected uiControlConfig: UIControlConfig;\n protected wrapupData?: WrapupData;\n public autoWrapup?: AutoWrapup;\n protected agentId?: string;\n\n constructor(\n contact: ReturnType<typeof routingContact>,\n data: TaskData,\n uiControlConfig: UIControlConfigInput,\n wrapupData?: WrapupData,\n agentId?: string\n ) {\n super();\n this.contact = contact;\n this.data = data;\n const channelType = uiControlConfig.channelType ?? Task.resolveChannelType(data);\n // Include agentId in the config for ownership checks (transfer conference)\n this.uiControlConfig = {...uiControlConfig, channelType, agentId};\n this.wrapupData = wrapupData;\n this.agentId = agentId;\n this.metricsManager = MetricsManager.getInstance();\n this.webCallMap = {};\n this.currentUiControls = getDefaultUIControls();\n this.initializeStateMachine();\n this.setupAutoWrapupTimer();\n }\n\n private static resolveChannelType(data: TaskData): UIControlConfig['channelType'] {\n const mediaType = data?.interaction?.mediaType ?? MEDIA_CHANNEL.TELEPHONY;\n\n return mediaType === MEDIA_CHANNEL.TELEPHONY\n ? TASK_CHANNEL_TYPE.VOICE\n : TASK_CHANNEL_TYPE.DIGITAL;\n }\n\n // Abstract methods that all child classes must implement\n public abstract accept(): Promise<TaskResponse>;\n\n // Voice-specific methods with default implementations that throw errors\n // Voice class will override these with actual implementations\n public async decline(): Promise<TaskResponse> {\n this.unsupportedMethodError('decline');\n }\n\n public async pauseRecording(): Promise<TaskResponse> {\n this.unsupportedMethodError('pauseRecording');\n }\n\n public async resumeRecording(\n resumeRecordingPayload: ResumeRecordingPayload\n ): Promise<TaskResponse> {\n if (resumeRecordingPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('resumeRecording');\n }\n\n public async consult(consultPayload: ConsultPayload): Promise<TaskResponse> {\n if (consultPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('consult');\n }\n\n public async endConsult(consultEndPayload: ConsultEndPayload): Promise<TaskResponse> {\n if (consultEndPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('endConsult');\n }\n\n public async consultTransfer(\n consultTransferPayload?: ConsultTransferPayLoad\n ): Promise<TaskResponse> {\n if (consultTransferPayload) {\n // parameter intentionally unused\n }\n this.unsupportedMethodError('consultTransfer');\n }\n\n public async consultConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('consultConference');\n }\n\n public async exitConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('exitConference');\n }\n\n public async transferConference(): Promise<TaskResponse> {\n this.unsupportedMethodError('transferConference');\n }\n\n public async switchCall(): Promise<TaskResponse> {\n this.unsupportedMethodError('switchCall');\n }\n\n public async toggleMute(): Promise<void> {\n this.unsupportedMethodError('toggleMute');\n }\n\n public unregisterWebCallListeners(): void {\n // Default implementation - child classes can override\n LoggerProxy.log('unregisterWebCallListeners called', {\n module: CC_FILE,\n method: 'unregisterWebCallListeners',\n interactionId: this.data?.interactionId,\n });\n }\n\n /**\n * Cancel any in-progress auto wrap-up timer.\n * Base implementation just clears the timer reference so subclasses inherit the behavior.\n */\n public cancelAutoWrapupTimer(): void {\n if (this.autoWrapup) {\n this.autoWrapup.clear();\n this.autoWrapup = undefined;\n LoggerProxy.log('Auto wrap-up timer cancelled', {\n module: CC_FILE,\n method: 'cancelAutoWrapupTimer',\n interactionId: this.data?.interactionId,\n });\n }\n }\n\n // Voice tasks use holdResume(), but provide separate methods for interface compliance\n public async hold(): Promise<TaskResponse> {\n this.unsupportedMethodError('hold');\n }\n\n public async resume(): Promise<TaskResponse> {\n this.unsupportedMethodError('resume');\n }\n\n public async holdResume(): Promise<TaskResponse> {\n this.unsupportedMethodError('holdResume');\n }\n\n /**\n * Latest UI controls derived from state machine state and context.\n */\n public get uiControls(): TaskUIControls {\n return this.currentUiControls;\n }\n\n protected updateUiControls(forceEmit = false): void {\n const nextControls = this.computeUIControls();\n const shouldEmit = forceEmit || haveUIControlsChanged(this.currentUiControls, nextControls);\n this.currentUiControls = nextControls;\n\n if (shouldEmit) {\n this.emit(TASK_EVENTS.TASK_UI_CONTROLS_UPDATED, this.currentUiControls);\n }\n }\n\n /**\n * Initialize the state machine\n */\n private initializeStateMachine(): void {\n const machine: TaskStateMachine = createTaskStateMachine(this.uiControlConfig, {\n actions: this.getStateMachineActionOverrides(),\n });\n\n this.stateMachineService = createActor(machine);\n\n this.stateMachineService.subscribe((snapshot) => {\n const previousState = this.lastState;\n const currentState = snapshot.value as TaskState;\n LoggerProxy.log(`State machine transition: ${previousState || 'N/A'} -> ${currentState}`, {\n module: CC_FILE,\n method: 'onTransition',\n // @ts-ignore - snapshot may include event detail depending on XState version\n eventType: (snapshot as any)?.event?.type,\n });\n this.lastState = currentState;\n this.state = snapshot;\n\n this.updateUiControls(previousState !== currentState);\n });\n\n this.stateMachineService.start();\n this.updateUiControls(true);\n }\n\n /**\n * Send an event to the state machine\n */\n public sendStateMachineEvent(event: TaskEventPayload): void {\n if (this.stateMachineService) {\n LoggerProxy.log(`Sending state machine event: ${event?.type}`, {\n module: CC_FILE,\n method: 'sendStateMachineEvent',\n interactionId: this.data?.interactionId,\n });\n\n this.stateMachineService.send(event);\n }\n }\n\n /**\n * Get the current state machine state\n */\n protected getCurrentState(): TaskState | undefined {\n return this.stateMachineService?.getSnapshot()?.value as TaskState;\n }\n\n /**\n * Compute UI controls based on current state machine state.\n *\n * @returns UI control states for all task actions\n */\n protected computeUIControls(): TaskUIControls {\n const snapshot = this.stateMachineService?.getSnapshot?.();\n\n if (!snapshot) {\n return getDefaultUIControls();\n }\n\n const currentState = snapshot.value as TaskState;\n const context = snapshot.context as TaskContext;\n\n return computeUIControls(currentState, context, this.data);\n }\n\n /**\n * Stop the state machine service\n */\n protected stopStateMachine(): void {\n if (this.stateMachineService) {\n this.stateMachineService.stop();\n this.stateMachineService = undefined;\n }\n }\n\n private static extractTaskDataFromEvent(event?: TaskEventPayload): TaskData | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n\n if ('taskData' in event) {\n return (event as {taskData?: TaskData}).taskData;\n }\n\n return undefined;\n }\n\n private async autoAnswerIfNeeded(): Promise<void> {\n if (!this.data) {\n return;\n }\n\n const autoAnswerSupported =\n this.uiControlConfig.channelType === TASK_CHANNEL_TYPE.DIGITAL ||\n this.uiControlConfig.voiceVariant === VOICE_VARIANT.WEBRTC;\n\n if (!autoAnswerSupported) {\n return;\n }\n\n const shouldAutoAnswer = this.data.isAutoAnswering === true;\n\n if (!shouldAutoAnswer) {\n return;\n }\n\n LoggerProxy.info(`Auto-answering task`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n });\n\n try {\n await this.accept();\n LoggerProxy.info(`Task auto-answered successfully`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_SUCCESS,\n {\n taskId: this.data.interactionId,\n mediaType: this.data.interaction.mediaType,\n isAutoAnswered: true,\n },\n ['behavioral', 'operational']\n );\n\n this.emit(TASK_EVENTS.TASK_AUTO_ANSWERED, this);\n } catch (error) {\n this.updateTaskData({...this.data, isAutoAnswering: false});\n LoggerProxy.error(`Failed to auto-answer task`, {\n module: TASK_FILE,\n method: 'autoAnswerIfNeeded',\n interactionId: this.data.interactionId,\n error,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_FAILED,\n {\n taskId: this.data.interactionId,\n mediaType: this.data.interaction.mediaType,\n error: error?.message || 'Unknown error',\n isAutoAnswered: false,\n },\n ['behavioral', 'operational']\n );\n }\n }\n\n private updateTaskFromEvent(event?: TaskEventPayload): void {\n const taskData = Task.extractTaskDataFromEvent(event);\n if (taskData) {\n this.updateTaskData(taskData);\n }\n }\n\n protected getStateMachineActionOverrides(): Partial<TaskActionsMap> {\n return {\n ...this.getCommonActionOverrides(),\n ...this.getChannelSpecificActionOverrides(),\n };\n }\n\n protected getChannelSpecificActionOverrides(): Partial<TaskActionsMap> {\n return {};\n }\n\n protected createEmitSelfAction(\n taskEvent: TASK_EVENTS,\n {updateTaskData = false}: {updateTaskData?: boolean} = {}\n ) {\n return ({event}: TaskActionArgs) => {\n if (updateTaskData) {\n this.updateTaskFromEvent(event);\n }\n LoggerProxy.info(`Emitting task event ${taskEvent}`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n this.emit(taskEvent, this);\n };\n }\n\n private getCommonActionOverrides(): Partial<TaskActionsMap> {\n return {\n syncTaskDataFromEvent: ({event}: {event: TaskEventPayload}) => {\n this.updateTaskFromEvent(event);\n },\n emitTaskIncoming: this.createEmitSelfAction(TASK_EVENTS.TASK_INCOMING, {\n updateTaskData: true,\n }),\n emitTaskHydrate: this.createEmitSelfAction(TASK_EVENTS.TASK_HYDRATE, {\n updateTaskData: true,\n }),\n emitTaskOfferContact: this.createEmitSelfAction(TASK_EVENTS.TASK_OFFER_CONTACT, {\n updateTaskData: true,\n }),\n emitTaskAssigned: this.createEmitSelfAction(TASK_EVENTS.TASK_ASSIGNED, {\n updateTaskData: true,\n }),\n emitTaskEnd: this.createEmitSelfAction(TASK_EVENTS.TASK_END, {updateTaskData: true}),\n emitTaskOfferConsult: this.createEmitSelfAction(TASK_EVENTS.TASK_OFFER_CONSULT, {\n updateTaskData: true,\n }),\n emitTaskConsultCreated: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_CREATED, {\n updateTaskData: true,\n }),\n emitTaskConsulting: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n if (this.data.isConsulted) {\n this.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, this);\n } else {\n this.emit(TASK_EVENTS.TASK_CONSULTING, this);\n }\n },\n emitTaskConsultAccepted: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_ACCEPTED),\n emitTaskConsultEnd: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_END, {\n updateTaskData: true,\n }),\n emitTaskConsultQueueCancelled: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED,\n {\n updateTaskData: true,\n }\n ),\n emitTaskConsultQueueFailed: this.createEmitSelfAction(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, {\n updateTaskData: true,\n }),\n emitTaskReject: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n const reason =\n event && typeof event === 'object' && 'reason' in event\n ? (event as {reason?: string}).reason\n : undefined;\n this.emit(TASK_EVENTS.TASK_REJECT, reason);\n },\n emitTaskWrapup: ({event}: {event?: TaskEventPayload}) => {\n this.updateTaskFromEvent(event);\n\n const shouldEmitWrapup = Boolean(this.data.wrapUpRequired);\n if (!shouldEmitWrapup) {\n LoggerProxy.info(`Skipping task:wrapup event - wrapUpRequired is false`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n\n return;\n }\n LoggerProxy.info(`Emitting task event ${TASK_EVENTS.TASK_WRAPUP}`, {\n module: TASK_FILE,\n method: 'emitTaskEvent',\n interactionId: this.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_WRAPUP, this);\n },\n emitTaskWrappedup: this.createEmitSelfAction(TASK_EVENTS.TASK_WRAPPEDUP, {\n updateTaskData: true,\n }),\n requestAutoAnswer: ({event}: TaskActionArgs) => {\n if (event) {\n // parameter intentionally unused\n }\n this.autoAnswerIfNeeded();\n },\n requestCleanup: () => {\n this.emit(TASK_EVENTS.TASK_CLEANUP, this, {removeFromCollection: false});\n },\n cleanupResources: () => {\n this.emit(TASK_EVENTS.TASK_CLEANUP, this, {removeFromCollection: true});\n },\n };\n }\n\n /**\n * Sets up the automatic wrap-up timer if wrap-up is required\n */\n protected setupAutoWrapupTimer(): void {\n if (\n this.data.wrapUpRequired &&\n !this.autoWrapup &&\n this.wrapupData &&\n this.wrapupData.wrapUpProps\n ) {\n const wrapUpProps = this.wrapupData.wrapUpProps;\n if (!wrapUpProps || wrapUpProps.autoWrapup === false) {\n LoggerProxy.info(`Auto wrap-up is not required for this task`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n interactionId: this.data.interactionId,\n });\n\n return;\n }\n const defaultWrapupReason =\n wrapUpProps.wrapUpReasonList?.find((r) => r.isDefault) ?? wrapUpProps.wrapUpReasonList?.[0];\n if (!defaultWrapupReason) {\n LoggerProxy.error('No wrap-up reason configured', {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n });\n\n return;\n }\n const intervalMs = wrapUpProps.autoWrapupInterval;\n if (!intervalMs || intervalMs <= 0) {\n LoggerProxy.error(`Invalid auto wrap-up interval: ${intervalMs}`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n });\n\n return;\n }\n this.autoWrapup = new AutoWrapup(intervalMs, wrapUpProps.allowCancelAutoWrapup);\n this.autoWrapup.start(async () => {\n LoggerProxy.info(`Auto wrap-up timer triggered`, {\n module: TASK_FILE,\n method: METHODS.SETUP_AUTO_WRAPUP_TIMER,\n interactionId: this.data.interactionId,\n });\n await this.wrapup({\n wrapUpReason: defaultWrapupReason.name,\n auxCodeId: defaultWrapupReason.id,\n });\n });\n }\n }\n\n /**\n * Cancels the automatic wrap-up timer if it's running\n */\n private reconcileData(oldData: TaskData, newData: TaskData): TaskData {\n Object.keys(newData).forEach((key) => {\n if (newData[key] && typeof newData[key] === 'object' && !Array.isArray(newData[key])) {\n oldData[key] = this.reconcileData({...oldData[key]}, newData[key]);\n } else {\n oldData[key] = newData[key];\n }\n });\n\n return oldData;\n }\n\n /**\n *\n * @param methodName - The name of the method that is unsupported\n * @throws Error\n */\n protected unsupportedMethodError(methodName: string) {\n LoggerProxy.error(`Unsupported operation`, {\n module: 'TASK',\n method: methodName,\n interactionId: this.data?.interactionId,\n });\n throw new Error(`Unsupported operation: ${methodName}`);\n }\n\n /**\n * This method is used to update the task data.\n * @param updatedData - TaskData\n * @param shouldOverwrite - boolean\n * @example\n * ```typescript\n * task.updateTaskData(updatedData, true);\n * ```\n */\n public updateTaskData(updatedData: TaskData, shouldOverwrite = false): ITask {\n this.data = shouldOverwrite ? updatedData : this.reconcileData(this.data, updatedData);\n if (!shouldOverwrite) {\n this.pruneStaleInteractionMaps(updatedData);\n }\n this.updateUiControls();\n this.setupAutoWrapupTimer();\n\n return this;\n }\n\n /**\n * The backend sends `interaction.media` and `interaction.participants` as complete snapshots\n * of the current call state. `reconcileData` deep-merges and never removes keys, so entries the\n * backend dropped (e.g. a consult leg's media and consultee participant after the consult ends)\n * linger in `this.data`. That stale data drives incorrect UI controls (e.g. the consult button\n * staying disabled after the consult leg is gone, until a page refresh re-hydrates cleanly).\n * Make only these two snapshot maps authoritative to the incoming payload, leaving every other\n * field on the generic deep-merge path (CAD and other partial updates still merge as before).\n */\n private pruneStaleInteractionMaps(incoming: TaskData): void {\n const incomingInteraction = incoming?.interaction;\n const currentInteraction = this.data?.interaction;\n if (!incomingInteraction || !currentInteraction) {\n return;\n }\n\n (['media', 'participants'] as const).forEach((mapKey) => {\n const incomingMap = incomingInteraction[mapKey] as Record<string, unknown> | undefined;\n const currentMap = currentInteraction[mapKey] as Record<string, unknown> | undefined;\n if (!incomingMap || !currentMap || typeof incomingMap !== 'object') {\n return;\n }\n\n Object.keys(currentMap).forEach((id) => {\n if (!(id in incomingMap)) {\n delete currentMap[id];\n }\n });\n });\n }\n\n /**\n * This is used to blind transfer or vTeam transfer the task\n * @param transferPayload\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * const transferPayload = {\n * to: 'myQueueId',\n * destinationType: 'queue',\n * }\n * task.transfer(transferPayload).then(()=>{}).catch(()=>{});\n * ```\n */\n public async transfer(transferPayload: TransferPayLoad): Promise<TaskResponse> {\n LoggerProxy.log(`Starting task transfer for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'transfer',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_TRANSFER_SUCCESS,\n METRIC_EVENT_NAMES.TASK_TRANSFER_FAILED,\n ]);\n let result: TaskResponse;\n if (transferPayload.destinationType === DESTINATION_TYPE.QUEUE) {\n result = await this.contact.vteamTransfer({\n interactionId: this.data.interactionId,\n data: transferPayload,\n });\n } else {\n result = await this.contact.blindTransfer({\n interactionId: this.data.interactionId,\n data: transferPayload,\n });\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_TRANSFER_SUCCESS,\n {\n taskId: this.data.interactionId,\n destination: transferPayload.to,\n destinationType: transferPayload.destinationType,\n isConsultTransfer: false,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(result),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return result;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'transfer', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_TRANSFER_FAILED,\n {\n taskId: this.data.interactionId,\n destination: transferPayload.to,\n destinationType: transferPayload.destinationType,\n isConsultTransfer: false,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n\n /**\n * This is used to end the task.\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.end().then(()=>{}).catch(()=>{})\n * ```\n */\n public async end(): Promise<TaskResponse> {\n LoggerProxy.log(`Ending task for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'end',\n });\n const requestInteractionId =\n this.data.interaction?.mainInteractionId || this.data.interactionId;\n\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_END_SUCCESS,\n METRIC_EVENT_NAMES.TASK_END_FAILED,\n ]);\n const response = await this.contact.end({interactionId: requestInteractionId});\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_END_SUCCESS,\n {\n taskId: this.data.interactionId,\n requestInteractionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return response;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'end', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_END_FAILED,\n {\n taskId: this.data.interactionId,\n requestInteractionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n\n /**\n * This is used to wrap up the task.\n * @param wrapupPayload - WrapupPayLoad\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.wrapup(wrapupPayload).then(()=>{}).catch(()=>{})\n * ```\n */\n public async wrapup(wrapupPayload: WrapupPayLoad): Promise<TaskResponse> {\n this.cancelAutoWrapupTimer();\n LoggerProxy.log(`Starting task wrapup for taskId:${this.data.interactionId}`, {\n module: 'Task',\n method: 'wrapup',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_WRAPUP_SUCCESS,\n METRIC_EVENT_NAMES.TASK_WRAPUP_FAILED,\n ]);\n if (!this.data) {\n throw new Error('No task data available');\n }\n if (!wrapupPayload.auxCodeId || wrapupPayload.auxCodeId.length === 0) {\n throw new Error('AuxCodeId is required');\n }\n if (!wrapupPayload.wrapUpReason || wrapupPayload.wrapUpReason.length === 0) {\n throw new Error('WrapUpReason is required');\n }\n\n const response = await this.contact.wrapup({\n interactionId: this.data.interactionId,\n data: wrapupPayload,\n });\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_WRAPUP_SUCCESS,\n {\n taskId: this.data.interactionId,\n wrapUpCode: wrapupPayload.auxCodeId,\n wrapUpReason: wrapupPayload.wrapUpReason,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return response;\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'wrapup', CC_FILE);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_WRAPUP_FAILED,\n {\n taskId: this.data.interactionId,\n wrapUpCode: wrapupPayload.auxCodeId,\n wrapUpReason: wrapupPayload.wrapUpReason,\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n throw detailedError;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -62,7 +62,12 @@ class TaskManager extends _events.default {
|
|
|
62
62
|
});
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
switch (payload.type) {
|
|
66
|
+
case _types2.CC_EVENTS.REAL_TIME_TRANSCRIPTION:
|
|
67
|
+
case _types2.CC_EVENTS.SUGGESTED_RESPONSE:
|
|
68
|
+
task.emit(payload.type, payload.data);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
66
71
|
} catch (error) {
|
|
67
72
|
_loggerProxy.default.error('Failed to parse RTD WebSocket message', {
|
|
68
73
|
module: _constants.TASK_MANAGER_FILE,
|
|
@@ -707,7 +712,7 @@ class TaskManager extends _events.default {
|
|
|
707
712
|
requestRealTimeTranscripts(eventType, interactionId) {
|
|
708
713
|
const action = _constants2.TRANSCRIPT_EVENT_MAP[eventType];
|
|
709
714
|
if (!action || !this.apiAIAssistant) return;
|
|
710
|
-
if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable
|
|
715
|
+
if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable !== true) return;
|
|
711
716
|
this.apiAIAssistant.sendEvent(this.agentId, interactionId, _types3.AIAssistantEventType.CUSTOM_EVENT, _types3.AIAssistantEventName.GET_TRANSCRIPTS, action).catch(error => {
|
|
712
717
|
_loggerProxy.default.error(`Failed to send transcript ${action} event`, {
|
|
713
718
|
module: _constants.TASK_MANAGER_FILE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebRTC","_stateMachine","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","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","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEFT_CONFERENCE","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","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","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, taskData: payload, 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.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const 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 && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n 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":[]}
|
|
1
|
+
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebRTC","_stateMachine","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","type","REAL_TIME_TRANSCRIPTION","SUGGESTED_RESPONSE","emit","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","handleIncomingWebCall","call","currentTask","find","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","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEFT_CONFERENCE","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","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","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 switch (payload.type) {\n case CC_EVENTS.REAL_TIME_TRANSCRIPTION:\n case CC_EVENTS.SUGGESTED_RESPONSE:\n task.emit(payload.type, payload.data);\n break;\n }\n } catch (error) {\n LoggerProxy.error('Failed to parse RTD WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n error,\n });\n }\n }\n\n /**\n * Set config flags for task creation\n */\n public setConfigFlags(configFlags: ConfigFlags) {\n this.configFlags = configFlags;\n }\n\n /**\n * Set wrapup configuration data\n */\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n /**\n * Set agent ID for task operations\n */\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (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, taskData: payload, 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.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const 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 && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n 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 !== true) return;\n\n this.apiAIAssistant\n .sendEvent(\n this.agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.GET_TRANSCRIPTS,\n action\n )\n .catch((error) => {\n LoggerProxy.error(`Failed to send transcript ${action} event`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REQUEST_REAL_TIME_TRANSCRIPTS,\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n public getAllTasks(): Record<TaskId, ITask> {\n return {...this.taskCollection};\n }\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager?: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager,\n rtdWebSocketManager\n );\n }\n\n return TaskManager.taskManager;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -74,7 +74,9 @@ const getIsConsultInProgressForConferenceControls = (interaction, mainCallId, se
|
|
|
74
74
|
const p = interaction.participants?.[participantId];
|
|
75
75
|
if (!p || p.hasLeft) return false;
|
|
76
76
|
if (selfAgentId && participantId === selfAgentId) return false;
|
|
77
|
-
const
|
|
77
|
+
const consultState = p.consultState;
|
|
78
|
+
const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;
|
|
79
|
+
const consultLegActive = consultState === 'consulting' || p.currentState === 'consulting' || p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee;
|
|
78
80
|
return consultLegActive && !mainSet.has(participantId);
|
|
79
81
|
});
|
|
80
82
|
});
|