@webex/contact-center 3.12.0-task-refactor.11 → 3.12.0-task-refactor.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/cc.js +297 -83
  2. package/dist/cc.js.map +1 -1
  3. package/dist/constants.js +3 -0
  4. package/dist/constants.js.map +1 -1
  5. package/dist/metrics/behavioral-events.js +39 -0
  6. package/dist/metrics/behavioral-events.js.map +1 -1
  7. package/dist/metrics/constants.js +8 -1
  8. package/dist/metrics/constants.js.map +1 -1
  9. package/dist/services/ApiAiAssistant.js +3 -0
  10. package/dist/services/ApiAiAssistant.js.map +1 -1
  11. package/dist/services/config/Util.js +1 -1
  12. package/dist/services/config/Util.js.map +1 -1
  13. package/dist/services/config/types.js +10 -0
  14. package/dist/services/config/types.js.map +1 -1
  15. package/dist/services/constants.js +1 -0
  16. package/dist/services/constants.js.map +1 -1
  17. package/dist/services/core/Err.js.map +1 -1
  18. package/dist/services/core/Utils.js +57 -6
  19. package/dist/services/core/Utils.js.map +1 -1
  20. package/dist/services/core/aqm-reqs.js +92 -17
  21. package/dist/services/core/aqm-reqs.js.map +1 -1
  22. package/dist/services/core/websocket/WebSocketManager.js +24 -3
  23. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  24. package/dist/services/index.js +1 -0
  25. package/dist/services/index.js.map +1 -1
  26. package/dist/services/task/Task.js +6 -0
  27. package/dist/services/task/Task.js.map +1 -1
  28. package/dist/services/task/TaskManager.js +155 -6
  29. package/dist/services/task/TaskManager.js.map +1 -1
  30. package/dist/services/task/TaskUtils.js +39 -11
  31. package/dist/services/task/TaskUtils.js.map +1 -1
  32. package/dist/services/task/constants.js +7 -1
  33. package/dist/services/task/constants.js.map +1 -1
  34. package/dist/services/task/dialer.js +129 -0
  35. package/dist/services/task/dialer.js.map +1 -1
  36. package/dist/services/task/state-machine/TaskStateMachine.js +30 -3
  37. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  38. package/dist/services/task/state-machine/actions.js +4 -0
  39. package/dist/services/task/state-machine/actions.js.map +1 -1
  40. package/dist/services/task/state-machine/constants.js +3 -0
  41. package/dist/services/task/state-machine/constants.js.map +1 -1
  42. package/dist/services/task/state-machine/guards.js +23 -0
  43. package/dist/services/task/state-machine/guards.js.map +1 -1
  44. package/dist/services/task/state-machine/types.js.map +1 -1
  45. package/dist/services/task/types.js +59 -0
  46. package/dist/services/task/types.js.map +1 -1
  47. package/dist/types/cc.d.ts +76 -2
  48. package/dist/types/constants.d.ts +3 -0
  49. package/dist/types/metrics/constants.d.ts +6 -0
  50. package/dist/types/services/config/types.d.ts +22 -1
  51. package/dist/types/services/core/Err.d.ts +6 -0
  52. package/dist/types/services/core/Utils.d.ts +20 -2
  53. package/dist/types/services/core/aqm-reqs.d.ts +49 -0
  54. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  55. package/dist/types/services/core/websocket/connection-service.d.ts +1 -0
  56. package/dist/types/services/task/Task.d.ts +1 -0
  57. package/dist/types/services/task/TaskUtils.d.ts +13 -0
  58. package/dist/types/services/task/constants.d.ts +6 -0
  59. package/dist/types/services/task/dialer.d.ts +45 -0
  60. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +36 -8
  61. package/dist/types/services/task/state-machine/constants.d.ts +3 -0
  62. package/dist/types/services/task/state-machine/guards.d.ts +2 -0
  63. package/dist/types/services/task/state-machine/types.d.ts +11 -0
  64. package/dist/types/services/task/types.d.ts +75 -1
  65. package/dist/types.js.map +1 -1
  66. package/dist/webex.js +1 -1
  67. package/package.json +2 -2
  68. package/src/cc.ts +389 -111
  69. package/src/constants.ts +3 -0
  70. package/src/metrics/behavioral-events.ts +42 -0
  71. package/src/metrics/constants.ts +9 -1
  72. package/src/services/ApiAiAssistant.ts +3 -0
  73. package/src/services/config/Util.ts +1 -1
  74. package/src/services/config/types.ts +12 -1
  75. package/src/services/constants.ts +1 -0
  76. package/src/services/core/Err.ts +3 -0
  77. package/src/services/core/Utils.ts +68 -5
  78. package/src/services/core/aqm-reqs.ts +100 -22
  79. package/src/services/core/websocket/WebSocketManager.ts +23 -2
  80. package/src/services/index.ts +1 -0
  81. package/src/services/task/Task.ts +13 -0
  82. package/src/services/task/TaskManager.ts +171 -7
  83. package/src/services/task/TaskUtils.ts +33 -1
  84. package/src/services/task/constants.ts +6 -0
  85. package/src/services/task/dialer.ts +136 -1
  86. package/src/services/task/state-machine/TaskStateMachine.ts +37 -5
  87. package/src/services/task/state-machine/actions.ts +4 -0
  88. package/src/services/task/state-machine/constants.ts +3 -0
  89. package/src/services/task/state-machine/guards.ts +30 -0
  90. package/src/services/task/state-machine/types.ts +14 -1
  91. package/src/services/task/types.ts +80 -0
  92. package/src/types.ts +4 -1
  93. package/test/unit/spec/cc.ts +293 -26
  94. package/test/unit/spec/services/config/index.ts +30 -2
  95. package/test/unit/spec/services/core/Utils.ts +367 -1
  96. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +90 -1
  97. package/test/unit/spec/services/core/websocket/connection-service.ts +4 -5
  98. package/test/unit/spec/services/task/TaskManager.ts +2325 -150
  99. package/test/unit/spec/services/task/dialer.ts +372 -96
  100. package/umd/contact-center.min.js +2 -2
  101. 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","TASK_MULTI_LOGIN_HYDRATE","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 const uiControls = computeUIControls(currentState, context, this.data);\n\n return uiControls;\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: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n this.emit(TASK_EVENTS.TASK_ASSIGNED, this);\n this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this);\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 this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this);\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":[]}
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","emitTaskCampaignPreviewReservation","TASK_CAMPAIGN_PREVIEW_RESERVATION","emitTaskCampaignPreviewAcceptFailed","TASK_CAMPAIGN_PREVIEW_ACCEPT_FAILED","emitTaskCampaignPreviewSkipFailed","TASK_CAMPAIGN_PREVIEW_SKIP_FAILED","emitTaskCampaignPreviewRemoveFailed","TASK_CAMPAIGN_PREVIEW_REMOVE_FAILED","emitTaskHydrate","TASK_HYDRATE","emitTaskOfferContact","TASK_OFFER_CONTACT","emitTaskAssigned","TASK_ASSIGNED","TASK_MULTI_LOGIN_HYDRATE","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 const uiControls = computeUIControls(currentState, context, this.data);\n\n return uiControls;\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 emitTaskCampaignPreviewReservation: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION,\n {updateTaskData: true}\n ),\n emitTaskCampaignPreviewAcceptFailed: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_ACCEPT_FAILED\n ),\n emitTaskCampaignPreviewSkipFailed: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_SKIP_FAILED\n ),\n emitTaskCampaignPreviewRemoveFailed: this.createEmitSelfAction(\n TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_REMOVE_FAILED\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: ({event}: TaskActionArgs) => {\n this.updateTaskFromEvent(event);\n this.emit(TASK_EVENTS.TASK_ASSIGNED, this);\n this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this);\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 this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this);\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":[]}
@@ -110,7 +110,7 @@ class TaskManager extends _events.default {
110
110
  this.webRtcEnabled = webRtcEnabled;
111
111
  }
112
112
  handleIncomingWebCall = call => {
113
- const currentTask = Object.values(this.taskCollection).find(t => t.data.interaction.mediaType === _types.MEDIA_CHANNEL.TELEPHONY);
113
+ const currentTask = Object.values(this.taskCollection).find(task => task.data.interaction.mediaType === 'telephony' && !(0, _TaskUtils.isCampaignPreviewReservation)(task));
114
114
  if (currentTask) {
115
115
  this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);
116
116
  _loggerProxy.default.log(`Call mapped to task`, {
@@ -147,10 +147,24 @@ class TaskManager extends _events.default {
147
147
  // CC -> TaskEvent mappings (see TaskStateMachine comment for quick reference)
148
148
  case _types2.CC_EVENTS.AGENT_CONTACT_RESERVED:
149
149
  // AgentContactReserved -> TASK_INCOMING
150
+ if ((0, _TaskUtils.isCampaignPreviewTask)(payload)) {
151
+ return {
152
+ type: _stateMachine.TaskEvent.TASK_INCOMING,
153
+ taskData: payload,
154
+ isCampaignReservationAccept: true
155
+ };
156
+ }
150
157
  return {
151
158
  type: _stateMachine.TaskEvent.TASK_INCOMING,
152
159
  taskData: payload
153
160
  };
161
+ case _types2.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION:
162
+ // -> TASK_INCOMING (campaign branch via guard)
163
+ return {
164
+ type: _stateMachine.TaskEvent.TASK_INCOMING,
165
+ taskData: payload,
166
+ isCampaignReservationAccept: true
167
+ };
154
168
  case _types2.CC_EVENTS.AGENT_OFFER_CONTACT:
155
169
  // AgentOfferContact -> TASK_OFFERED
156
170
  return {
@@ -274,7 +288,7 @@ class TaskManager extends _events.default {
274
288
  type: _stateMachine.TaskEvent.CONTACT_ENDED,
275
289
  taskData: {
276
290
  ...payload,
277
- wrapUpRequired: payload.interaction?.state !== 'new'
291
+ wrapUpRequired: (0, _TaskUtils.isCampaignPreviewTask)(payload) ? false : payload.agentsPendingWrapUp?.includes(agentId || '') || false
278
292
  }
279
293
  };
280
294
  case _types2.CC_EVENTS.AGENT_INVITE_FAILED:
@@ -299,6 +313,21 @@ class TaskManager extends _events.default {
299
313
  taskData: payload,
300
314
  reason: payload.reason
301
315
  };
316
+ case _types2.CC_EVENTS.CAMPAIGN_PREVIEW_ACCEPT_FAILED:
317
+ return {
318
+ type: _stateMachine.TaskEvent.CAMPAIGN_PREVIEW_ACCEPT_FAILED,
319
+ taskData: payload
320
+ };
321
+ case _types2.CC_EVENTS.CAMPAIGN_PREVIEW_SKIP_FAILED:
322
+ return {
323
+ type: _stateMachine.TaskEvent.CAMPAIGN_PREVIEW_SKIP_FAILED,
324
+ taskData: payload
325
+ };
326
+ case _types2.CC_EVENTS.CAMPAIGN_PREVIEW_REMOVE_FAILED:
327
+ return {
328
+ type: _stateMachine.TaskEvent.CAMPAIGN_PREVIEW_REMOVE_FAILED,
329
+ taskData: payload
330
+ };
302
331
  case _types2.CC_EVENTS.CONTACT_RECORDING_STARTED:
303
332
  return {
304
333
  type: _stateMachine.TaskEvent.RECORDING_STARTED,
@@ -450,7 +479,20 @@ class TaskManager extends _events.default {
450
479
  return null;
451
480
  }
452
481
  const interactionId = message.data.interactionId;
453
- const task = this.taskCollection[interactionId];
482
+ const reservationInteractionId = message.data.reservationInteractionId;
483
+ let task = this.taskCollection[interactionId];
484
+
485
+ // When a campaign preview contact is accepted, the assigned event may arrive
486
+ // with a new interactionId while the task is stored under the original
487
+ // reservationInteractionId. Fall back to that key so the task is found.
488
+ if (!task && reservationInteractionId) {
489
+ task = this.taskCollection[reservationInteractionId];
490
+ if (task) {
491
+ // Re-key the task under the new interaction ID and remove the old entry
492
+ delete this.taskCollection[reservationInteractionId];
493
+ this.taskCollection[interactionId] = task;
494
+ }
495
+ }
454
496
  const wasConsultedTask = Boolean(task?.data?.isConsulted);
455
497
  const computeWrapUpRequired = () => {
456
498
  if (message.data.wrapUpRequired !== undefined) {
@@ -502,12 +544,110 @@ class TaskManager extends _events.default {
502
544
  return this.handleAgentContact(context);
503
545
  case _types2.CC_EVENTS.CONTACT_MERGED:
504
546
  return this.handleContactMergedEvent(context);
547
+ case _types2.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION:
548
+ return this.handleCampaignPreviewReservation(context);
549
+ case _types2.CC_EVENTS.CAMPAIGN_CONTACT_UPDATED:
550
+ return this.handleCampaignContactUpdated(context);
505
551
  default:
506
552
  return {
507
553
  task: context.task
508
554
  };
509
555
  }
510
556
  }
557
+ handleCampaignContactUpdated(context) {
558
+ const {
559
+ payload
560
+ } = context;
561
+ let {
562
+ task
563
+ } = context;
564
+ // CampaignContactUpdated is a non-terminal event (e.g., next contact after skip/remove).
565
+ // Update the task data and emit an event so consumers can react to the updated contact.
566
+ // Do NOT remove the task or emit TASK_END — cleanup is handled by CONTACT_ENDED.
567
+ if (task) {
568
+ // Carry forward campaign preview fields from existing task data since the updated
569
+ // contact payload may not include them, and reconcileData would delete them.
570
+ const existingCpd = task.data?.interaction?.callProcessingDetails;
571
+ const updatedData = {
572
+ ...payload
573
+ };
574
+ if (existingCpd) {
575
+ const campaignFields = {
576
+ ...(existingCpd.campaignPreviewAutoAction && {
577
+ campaignPreviewAutoAction: existingCpd.campaignPreviewAutoAction
578
+ }),
579
+ ...(existingCpd.campaignPreviewOfferTimeout && {
580
+ campaignPreviewOfferTimeout: existingCpd.campaignPreviewOfferTimeout
581
+ }),
582
+ ...(existingCpd.campaignPreviewSkipDisabled && {
583
+ campaignPreviewSkipDisabled: existingCpd.campaignPreviewSkipDisabled
584
+ }),
585
+ ...(existingCpd.campaignPreviewRemoveDisabled && {
586
+ campaignPreviewRemoveDisabled: existingCpd.campaignPreviewRemoveDisabled
587
+ })
588
+ };
589
+ if (!updatedData.interaction) {
590
+ updatedData.interaction = {};
591
+ }
592
+ updatedData.interaction = {
593
+ ...updatedData.interaction,
594
+ callProcessingDetails: {
595
+ ...campaignFields,
596
+ ...(updatedData.interaction.callProcessingDetails || {})
597
+ }
598
+ };
599
+ }
600
+ _loggerProxy.default.log('Campaign contact updated - carrying forward preview fields', {
601
+ module: _constants.TASK_MANAGER_FILE,
602
+ method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
603
+ interactionId: payload.interactionId,
604
+ data: {
605
+ hasCpd: !!updatedData.interaction?.callProcessingDetails,
606
+ autoAction: updatedData.interaction?.callProcessingDetails?.campaignPreviewAutoAction,
607
+ skipDisabled: updatedData.interaction?.callProcessingDetails?.campaignPreviewSkipDisabled,
608
+ removeDisabled: updatedData.interaction?.callProcessingDetails?.campaignPreviewRemoveDisabled
609
+ }
610
+ });
611
+ task = this.updateTaskData(task, updatedData);
612
+ task.emit(_types.TASK_EVENTS.TASK_CAMPAIGN_CONTACT_UPDATED, task);
613
+ }
614
+ return {
615
+ task
616
+ };
617
+ }
618
+
619
+ /**
620
+ * Creates or updates a task for campaign preview reservation.
621
+ * TASK_CAMPAIGN_PREVIEW_RESERVATION is emitted by the state machine (campaign TASK_INCOMING branch).
622
+ */
623
+ handleCampaignPreviewReservation(context) {
624
+ const {
625
+ payload
626
+ } = context;
627
+ let {
628
+ task
629
+ } = context;
630
+ _loggerProxy.default.log('Campaign preview reservation received', {
631
+ module: _constants.TASK_MANAGER_FILE,
632
+ method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
633
+ interactionId: payload.interactionId
634
+ });
635
+ if (!task) {
636
+ task = _TaskFactory.default.createTask(this.contact, this.webCallingService, {
637
+ ...payload,
638
+ wrapUpRequired: false,
639
+ isConferenceInProgress: false,
640
+ isAutoAnswering: false
641
+ }, this.configFlags, this.wrapupData, this.agentId);
642
+ this.setupTaskListeners(task);
643
+ this.taskCollection[payload.interactionId] = task;
644
+ } else {
645
+ task = this.updateTaskData(task, payload);
646
+ }
647
+ return {
648
+ task
649
+ };
650
+ }
511
651
 
512
652
  /**
513
653
  * Handle AGENT_CONTACT_RESERVED event
@@ -591,6 +731,14 @@ class TaskManager extends _events.default {
591
731
  });
592
732
  this.emit(_types.TASK_EVENTS.TASK_INCOMING, t);
593
733
  });
734
+ task.on(_types.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, t => {
735
+ _loggerProxy.default.log(`Campaign preview reservation event received`, {
736
+ module: _constants.TASK_MANAGER_FILE,
737
+ method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
738
+ interactionId: t.data?.interactionId
739
+ });
740
+ this.emit(_types.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, t);
741
+ });
594
742
 
595
743
  // Listen for TASK_HYDRATE on the task and re-emit on TaskManager
596
744
  task.on(_types.TASK_EVENTS.TASK_HYDRATE, t => {
@@ -691,19 +839,20 @@ class TaskManager extends _events.default {
691
839
  * @private
692
840
  */
693
841
  handleTaskCleanup(task) {
842
+ // Clean up Desktop/WebRTC calling resources for browser-based telephony tasks
694
843
  if (this.webCallingService.loginOption === _types3.LoginOption.BROWSER && task.data.interaction.mediaType === _types.MEDIA_CHANNEL.TELEPHONY && task instanceof _WebRTC.default) {
695
844
  task.unregisterWebCallListeners();
696
845
  this.webCallingService.cleanUpCall();
697
846
  }
698
847
  const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';
699
848
  const isNew = task.data.interaction.state === 'new';
700
- const needsWrapUp = task.data.agentsPendingWrapUp?.length > 0;
849
+ const needsWrapUp = task.data.agentsPendingWrapUp?.includes(this.agentId) ?? false;
701
850
 
702
851
  // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)
703
- // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)
704
852
  // For non-OUTDIAL: remove if state is 'new'
705
853
  // Always remove if secondary EpDn agent
706
- if (isNew && !(isOutdial && needsWrapUp) || (0, _TaskUtils.isSecondaryEpDnAgent)(task.data.interaction)) {
854
+ if (isNew && !(isOutdial && needsWrapUp) || (0, _TaskUtils.isSecondaryEpDnAgent)(task.data.interaction) || !needsWrapUp && isOutdial // For outdial tasks, needs wrap-up is false and state is "WRAPUP". We need to just remove the task.
855
+ ) {
707
856
  this.removeTaskFromCollection(task);
708
857
  }
709
858
  }