@webex/contact-center 3.12.0-task-refactor.6 → 3.12.0-task-refactor.8
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/services/task/Task.js +32 -0
- package/dist/services/task/Task.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 +77 -1
- 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 +101 -20
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- 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/webex.js +1 -1
- package/package.json +1 -1
- package/src/services/task/Task.ts +34 -0
- package/src/services/task/TaskUtils.ts +5 -3
- package/src/services/task/state-machine/TaskStateMachine.ts +105 -1
- package/src/services/task/state-machine/actions.ts +151 -25
- package/src/services/task/state-machine/uiControlsComputer.ts +185 -29
- package/test/unit/spec/services/task/Task.ts +61 -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 +662 -1
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -487,11 +487,43 @@ class Task extends _events.EventEmitter {
|
|
|
487
487
|
*/
|
|
488
488
|
updateTaskData(updatedData, shouldOverwrite = false) {
|
|
489
489
|
this.data = shouldOverwrite ? updatedData : this.reconcileData(this.data, updatedData);
|
|
490
|
+
if (!shouldOverwrite) {
|
|
491
|
+
this.pruneStaleInteractionMaps(updatedData);
|
|
492
|
+
}
|
|
490
493
|
this.updateUiControls();
|
|
491
494
|
this.setupAutoWrapupTimer();
|
|
492
495
|
return this;
|
|
493
496
|
}
|
|
494
497
|
|
|
498
|
+
/**
|
|
499
|
+
* The backend sends `interaction.media` and `interaction.participants` as complete snapshots
|
|
500
|
+
* of the current call state. `reconcileData` deep-merges and never removes keys, so entries the
|
|
501
|
+
* backend dropped (e.g. a consult leg's media and consultee participant after the consult ends)
|
|
502
|
+
* linger in `this.data`. That stale data drives incorrect UI controls (e.g. the consult button
|
|
503
|
+
* staying disabled after the consult leg is gone, until a page refresh re-hydrates cleanly).
|
|
504
|
+
* Make only these two snapshot maps authoritative to the incoming payload, leaving every other
|
|
505
|
+
* field on the generic deep-merge path (CAD and other partial updates still merge as before).
|
|
506
|
+
*/
|
|
507
|
+
pruneStaleInteractionMaps(incoming) {
|
|
508
|
+
const incomingInteraction = incoming?.interaction;
|
|
509
|
+
const currentInteraction = this.data?.interaction;
|
|
510
|
+
if (!incomingInteraction || !currentInteraction) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
['media', 'participants'].forEach(mapKey => {
|
|
514
|
+
const incomingMap = incomingInteraction[mapKey];
|
|
515
|
+
const currentMap = currentInteraction[mapKey];
|
|
516
|
+
if (!incomingMap || !currentMap || typeof incomingMap !== 'object') {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
Object.keys(currentMap).forEach(id => {
|
|
520
|
+
if (!(id in incomingMap)) {
|
|
521
|
+
delete currentMap[id];
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
|
|
495
527
|
/**
|
|
496
528
|
* This is used to blind transfer or vTeam transfer the task
|
|
497
529
|
* @param transferPayload
|
|
@@ -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":"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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","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":[]}
|
|
@@ -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
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_types","require","_constants","_types2","_constants2","getIsCustomerInCall","interaction","interactionId","mainCallMedia","media","participants","some","participantId","participant","pType","PARTICIPANT_TYPE","CUSTOMER","hasLeft","exports","getConferenceParticipantsCount","count","SUPERVISOR","VVA","getIsConsultInProgressForConferenceControls","mainCallId","selfAgentId","mainParticipants","Array","isArray","length","mainSet","Set","Object","values","m","mType","p","consultLegActive","consultState","isConsulted","currentState","has","getIsConsultedAgentForControls","taskData","context","isConsultingState","Boolean","consultInitiator","getServerHoldStateForControls","fallbackTaskData","undefined","isHold","mediaId","mediaResourceId","isPrimary","task","agentId","data","owner","isParticipantInMainInteraction","mediaObj","MEDIA_TYPE_MAIN_CALL","includes","checkParticipantNotInInteraction","getIsConferenceInProgress","mainInteractionId","mediaMainCall","participantsInMainCall","agentParticipants","forEach","add","size","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","type","OUTDIAL_DIRECTION","outboundType","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","getConsultMediaResourceId","consultMediaResourceId","entries"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE, OUTBOUND_TYPE} from '../../constants';\nimport {LoginOption} from '../../types';\nimport {PARTICIPANT_TYPE, MEDIA_TYPE_MAIN_CALL} from './state-machine/constants';\nimport {TaskContext} from './state-machine/types';\n\n/**\n * Checks if the customer is still in the call (not left)\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns true if customer is in the call\n */\nexport const getIsCustomerInCall = (interaction: Interaction, interactionId: string): boolean => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return false;\n }\n\n return mainCallMedia.participants.some((participantId: string) => {\n const participant = participants[participantId];\n\n return participant?.pType === PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;\n });\n};\n\n/**\n * Gets the count of active agent participants in the conference\n * Excludes Customer, Supervisor, and VVA participant types\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns Number of active agent participants\n */\nexport const getConferenceParticipantsCount = (\n interaction: Interaction,\n interactionId: string\n): number => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return 0;\n }\n\n let count = 0;\n for (const participantId of mainCallMedia.participants) {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n count += 1;\n }\n }\n\n return count;\n};\n\n/**\n * Determines if a consult is actively in-progress for conference control gating.\n * This is used to disable conference controls (End/Consult) only when a consult leg\n * still exists outside the main call participants.\n */\nexport const getIsConsultInProgressForConferenceControls = (\n interaction: Interaction | undefined,\n mainCallId: string | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!interaction || !mainCallId) return false;\n\n const mainParticipants = interaction.media?.[mainCallId]?.participants;\n if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;\n\n const mainSet = new Set(mainParticipants);\n const media = interaction.media;\n if (!media) return false;\n\n return Object.values(media).some((m: any) => {\n if (!m || m.mType !== 'consult') return false;\n if (!Array.isArray(m.participants) || m.participants.length === 0) return false;\n\n return m.participants.some((participantId: string) => {\n const p: any = interaction.participants?.[participantId];\n if (!p || p.hasLeft) return false;\n if (selfAgentId && participantId === selfAgentId) return false;\n\n const consultLegActive =\n p.consultState === 'consulting' ||\n p.isConsulted === true ||\n p.currentState === 'consulting';\n\n return consultLegActive && !mainSet.has(participantId);\n });\n });\n};\n\nexport const getIsConsultedAgentForControls = (\n taskData: TaskData | null,\n context: TaskContext,\n isConsultingState: boolean\n): boolean => {\n return Boolean(taskData?.isConsulted) || (isConsultingState && !context.consultInitiator);\n};\n\nexport const getServerHoldStateForControls = (\n context: TaskContext,\n mainCallId?: string,\n fallbackTaskData?: TaskData | null\n): boolean | undefined => {\n const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;\n if (!media) return undefined;\n\n if (mainCallId && media[mainCallId]) {\n return media[mainCallId].isHold ?? false;\n }\n\n const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;\n if (!mediaId) return undefined;\n\n return media[mediaId]?.isHold;\n};\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj &&\n mediaObj.mType === MEDIA_TYPE_MAIN_CALL &&\n mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param data - The task data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n *\n * For Agent B (consulted agent), their task's interactionId may be different from the main call.\n * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n if (!data.interaction) return false;\n\n const mainCallId = data.interaction.mainInteractionId || data.interactionId;\n const mediaMainCall = data.interaction.media?.[mainCallId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const {participants} = data.interaction;\n\n const agentParticipants = new Set();\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n agentParticipants.add(participantId);\n }\n });\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param interaction - The interaction object\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Gets the consult media resource ID for switch-call operations.\n * Searches for the consult media leg in the interaction.\n *\n * @param interaction - The interaction object\n * @param consultMediaResourceId - The consult media resource ID from task data\n * @param agentId - Current agent ID\n * @returns The consult media resource ID or undefined\n */\nexport const getConsultMediaResourceId = (\n interaction: Interaction | undefined,\n consultMediaResourceId: string | undefined,\n agentId: string | undefined\n): string | undefined => {\n // First priority: use consultMediaResourceId from task data if available\n if (consultMediaResourceId) {\n return consultMediaResourceId;\n }\n\n // Second priority: search for consult media leg in interaction.media\n if (!interaction?.media || !agentId) {\n return undefined;\n }\n\n // Find the consult media leg where this agent is a participant\n for (const [mediaId, media] of Object.entries(interaction.media)) {\n if (media.mType === 'consult' && media.participants?.includes(agentId)) {\n return mediaId;\n }\n }\n\n return undefined;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_types","require","_constants","_types2","_constants2","getIsCustomerInCall","interaction","interactionId","mainCallMedia","media","participants","some","participantId","participant","pType","PARTICIPANT_TYPE","CUSTOMER","hasLeft","exports","getConferenceParticipantsCount","count","SUPERVISOR","VVA","getIsConsultInProgressForConferenceControls","mainCallId","selfAgentId","mainParticipants","Array","isArray","length","mainSet","Set","Object","values","m","mType","p","consultState","isRonaPendingConsultee","hasJoined","consultLegActive","currentState","isConsulted","has","getIsConsultedAgentForControls","taskData","context","isConsultingState","Boolean","consultInitiator","getServerHoldStateForControls","fallbackTaskData","undefined","isHold","mediaId","mediaResourceId","isPrimary","task","agentId","data","owner","isParticipantInMainInteraction","mediaObj","MEDIA_TYPE_MAIN_CALL","includes","checkParticipantNotInInteraction","getIsConferenceInProgress","mainInteractionId","mediaMainCall","participantsInMainCall","agentParticipants","forEach","add","size","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","type","OUTDIAL_DIRECTION","outboundType","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","getConsultMediaResourceId","consultMediaResourceId","entries"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE, OUTBOUND_TYPE} from '../../constants';\nimport {LoginOption} from '../../types';\nimport {PARTICIPANT_TYPE, MEDIA_TYPE_MAIN_CALL} from './state-machine/constants';\nimport {TaskContext} from './state-machine/types';\n\n/**\n * Checks if the customer is still in the call (not left)\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns true if customer is in the call\n */\nexport const getIsCustomerInCall = (interaction: Interaction, interactionId: string): boolean => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return false;\n }\n\n return mainCallMedia.participants.some((participantId: string) => {\n const participant = participants[participantId];\n\n return participant?.pType === PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;\n });\n};\n\n/**\n * Gets the count of active agent participants in the conference\n * Excludes Customer, Supervisor, and VVA participant types\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns Number of active agent participants\n */\nexport const getConferenceParticipantsCount = (\n interaction: Interaction,\n interactionId: string\n): number => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return 0;\n }\n\n let count = 0;\n for (const participantId of mainCallMedia.participants) {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n count += 1;\n }\n }\n\n return count;\n};\n\n/**\n * Determines if a consult is actively in-progress for conference control gating.\n * This is used to disable conference controls (End/Consult) only when a consult leg\n * still exists outside the main call participants.\n */\nexport const getIsConsultInProgressForConferenceControls = (\n interaction: Interaction | undefined,\n mainCallId: string | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!interaction || !mainCallId) return false;\n\n const mainParticipants = interaction.media?.[mainCallId]?.participants;\n if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;\n\n const mainSet = new Set(mainParticipants);\n const media = interaction.media;\n if (!media) return false;\n\n return Object.values(media).some((m: any) => {\n if (!m || m.mType !== 'consult') return false;\n if (!Array.isArray(m.participants) || m.participants.length === 0) return false;\n\n return m.participants.some((participantId: string) => {\n const p: any = interaction.participants?.[participantId];\n if (!p || p.hasLeft) return false;\n if (selfAgentId && participantId === selfAgentId) return false;\n\n const consultState = p.consultState as string | undefined;\n const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;\n const consultLegActive =\n consultState === 'consulting' ||\n p.currentState === 'consulting' ||\n (p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee);\n\n return consultLegActive && !mainSet.has(participantId);\n });\n });\n};\n\nexport const getIsConsultedAgentForControls = (\n taskData: TaskData | null,\n context: TaskContext,\n isConsultingState: boolean\n): boolean => {\n return Boolean(taskData?.isConsulted) || (isConsultingState && !context.consultInitiator);\n};\n\nexport const getServerHoldStateForControls = (\n context: TaskContext,\n mainCallId?: string,\n fallbackTaskData?: TaskData | null\n): boolean | undefined => {\n const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;\n if (!media) return undefined;\n\n if (mainCallId && media[mainCallId]) {\n return media[mainCallId].isHold ?? false;\n }\n\n const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;\n if (!mediaId) return undefined;\n\n return media[mediaId]?.isHold;\n};\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj &&\n mediaObj.mType === MEDIA_TYPE_MAIN_CALL &&\n mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param data - The task data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n *\n * For Agent B (consulted agent), their task's interactionId may be different from the main call.\n * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n if (!data.interaction) return false;\n\n const mainCallId = data.interaction.mainInteractionId || data.interactionId;\n const mediaMainCall = data.interaction.media?.[mainCallId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const {participants} = data.interaction;\n\n const agentParticipants = new Set();\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n agentParticipants.add(participantId);\n }\n });\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param interaction - The interaction object\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Gets the consult media resource ID for switch-call operations.\n * Searches for the consult media leg in the interaction.\n *\n * @param interaction - The interaction object\n * @param consultMediaResourceId - The consult media resource ID from task data\n * @param agentId - Current agent ID\n * @returns The consult media resource ID or undefined\n */\nexport const getConsultMediaResourceId = (\n interaction: Interaction | undefined,\n consultMediaResourceId: string | undefined,\n agentId: string | undefined\n): string | undefined => {\n // First priority: use consultMediaResourceId from task data if available\n if (consultMediaResourceId) {\n return consultMediaResourceId;\n }\n\n // Second priority: search for consult media leg in interaction.media\n if (!interaction?.media || !agentId) {\n return undefined;\n }\n\n // Find the consult media leg where this agent is a participant\n for (const [mediaId, media] of Object.entries(interaction.media)) {\n if (media.mType === 'consult' && media.participants?.includes(agentId)) {\n return mediaId;\n }\n }\n\n return undefined;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -74,6 +74,15 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
74
74
|
// This root-level handler is for when task is already in another state (just updates data).
|
|
75
75
|
[_constants.TaskEvent.HYDRATE]: {
|
|
76
76
|
actions: ['updateTaskData', 'emitTaskHydrate']
|
|
77
|
+
},
|
|
78
|
+
// AgentConsultCreated from Stable Prod while already HELD/CONNECTED (external consult).
|
|
79
|
+
// Child states do not handle CONSULT_CREATED; wire here so updateTaskData + setConsultInitiator run.
|
|
80
|
+
[_constants.TaskEvent.CONSULT_CREATED]: {
|
|
81
|
+
actions: ['updateTaskData', 'setConsultInitiator']
|
|
82
|
+
},
|
|
83
|
+
// AgentConsultFailed (RONA) while HELD/CONNECTED without passing through CONSULT_INITIATING.
|
|
84
|
+
[_constants.TaskEvent.CONSULT_FAILED]: {
|
|
85
|
+
actions: ['updateTaskData', 'handleConsultFailed']
|
|
77
86
|
}
|
|
78
87
|
},
|
|
79
88
|
states: {
|
|
@@ -191,7 +200,7 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
191
200
|
// the consulted agent (Agent 2) accepts. Clears the incoming notification.
|
|
192
201
|
[_constants.TaskEvent.CONSULT_END]: {
|
|
193
202
|
target: _constants.TaskState.TERMINATED,
|
|
194
|
-
actions: ['updateTaskData', 'clearConsultState', '
|
|
203
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
195
204
|
}
|
|
196
205
|
}
|
|
197
206
|
},
|
|
@@ -239,6 +248,25 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
239
248
|
[_constants.TaskEvent.TRANSFER_FAILED]: {
|
|
240
249
|
actions: ['updateTaskData']
|
|
241
250
|
},
|
|
251
|
+
// AgentConsultEnded from Stable Prod while on connected leg (external end consult).
|
|
252
|
+
[_constants.TaskEvent.CONSULT_END]: [{
|
|
253
|
+
guard: ({
|
|
254
|
+
context,
|
|
255
|
+
event
|
|
256
|
+
}) => {
|
|
257
|
+
if (context.consultInitiator !== true) return false;
|
|
258
|
+
const taskData = (0, _guards.getTaskDataFromEvent)(event);
|
|
259
|
+
const mainId = taskData?.interaction?.mainInteractionId || taskData?.interactionId;
|
|
260
|
+
return Boolean(mainId && taskData?.interaction?.media?.[mainId]?.isHold === true);
|
|
261
|
+
},
|
|
262
|
+
target: _constants.TaskState.HELD,
|
|
263
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
264
|
+
}, {
|
|
265
|
+
guard: ({
|
|
266
|
+
context
|
|
267
|
+
}) => context.consultInitiator === true,
|
|
268
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
269
|
+
}],
|
|
242
270
|
// AgentContactEnded Event
|
|
243
271
|
[_constants.TaskEvent.CONTACT_ENDED]: [{
|
|
244
272
|
// Conference still active → CONFERENCING
|
|
@@ -308,6 +336,11 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
308
336
|
target: _constants.TaskState.CONSULT_INITIATING,
|
|
309
337
|
actions: ['setConsultInitiator', 'setConsultDestination']
|
|
310
338
|
},
|
|
339
|
+
// AgentConsulting while main leg is held (Task Refactor / Stable Prod consult accept).
|
|
340
|
+
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
341
|
+
target: _constants.TaskState.CONSULTING,
|
|
342
|
+
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultAgentJoined', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
343
|
+
},
|
|
311
344
|
// TODO: This may not be a valid transition, need to be removed
|
|
312
345
|
// AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred
|
|
313
346
|
[_constants.TaskEvent.TRANSFER_SUCCESS]: [{
|
|
@@ -333,6 +366,10 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
333
366
|
target: _constants.TaskState.TERMINATED,
|
|
334
367
|
actions: ['updateTaskData', 'markEnded', 'emitTaskEnd']
|
|
335
368
|
}],
|
|
369
|
+
// AgentConsultEnded from Stable Prod while main leg is held (external end consult).
|
|
370
|
+
[_constants.TaskEvent.CONSULT_END]: {
|
|
371
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
372
|
+
},
|
|
336
373
|
// TODO: This may not be a valid transition, this needs to be checked as well
|
|
337
374
|
[_constants.TaskEvent.TASK_WRAPUP]: {
|
|
338
375
|
target: _constants.TaskState.WRAPPING_UP,
|
|
@@ -366,6 +403,11 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
366
403
|
target: _constants.TaskState.CONSULTING,
|
|
367
404
|
actions: ['updateTaskData', 'setConsultInitiator']
|
|
368
405
|
},
|
|
406
|
+
// AgentConsulting (Task Refactor: AgentConsulting event, not CONSULT_SUCCESS)
|
|
407
|
+
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
408
|
+
target: _constants.TaskState.CONSULTING,
|
|
409
|
+
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultAgentJoined', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
410
|
+
},
|
|
369
411
|
// AgentConsultFailed, API Failures, AgentCtqFailed
|
|
370
412
|
[_constants.TaskEvent.CONSULT_FAILED]: [{
|
|
371
413
|
// Consult from conference → back to CONFERENCING
|
|
@@ -390,6 +432,15 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
390
432
|
}, {
|
|
391
433
|
target: _constants.TaskState.CONNECTED,
|
|
392
434
|
actions: ['updateTaskData', 'clearConsultState']
|
|
435
|
+
}],
|
|
436
|
+
// AgentConsultEnded from Stable Prod during consult initiation (external end consult).
|
|
437
|
+
[_constants.TaskEvent.CONSULT_END]: [{
|
|
438
|
+
guard: _guards.guards.isPrimaryMediaOnHold,
|
|
439
|
+
target: _constants.TaskState.HELD,
|
|
440
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
441
|
+
}, {
|
|
442
|
+
target: _constants.TaskState.CONNECTED,
|
|
443
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
393
444
|
}]
|
|
394
445
|
}
|
|
395
446
|
},
|
|
@@ -399,6 +450,26 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
399
450
|
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
400
451
|
actions: ['setConsultAgentJoined', 'setConsultDestination', 'updateTaskData', 'emitTaskConsulting']
|
|
401
452
|
},
|
|
453
|
+
// AgentConsultFailed (RONA / consultee declined) while the initiator is already in
|
|
454
|
+
// CONSULTING (AgentConsulting arrived during ringing). Mirror CONSULT_INITIATING so the
|
|
455
|
+
// initiator returns to their own leg (HELD when main is on hold, else CONNECTED) instead
|
|
456
|
+
// of staying in CONSULTING. Without this, handleConsultFailed clears consultInitiator but
|
|
457
|
+
// the machine stays in CONSULTING, so the trailing AgentConsultEnded falls through the
|
|
458
|
+
// CONSULT_END "consulted agent" branch to TERMINATED and wrongly clears the task.
|
|
459
|
+
[_constants.TaskEvent.CONSULT_FAILED]: [{
|
|
460
|
+
guard: ({
|
|
461
|
+
context
|
|
462
|
+
}) => context.consultFromConference === true,
|
|
463
|
+
target: _constants.TaskState.CONFERENCING,
|
|
464
|
+
actions: ['updateTaskData', 'handleConsultFailed']
|
|
465
|
+
}, {
|
|
466
|
+
guard: _guards.guards.isPrimaryMediaOnHold,
|
|
467
|
+
target: _constants.TaskState.HELD,
|
|
468
|
+
actions: ['updateTaskData', 'handleConsultFailed']
|
|
469
|
+
}, {
|
|
470
|
+
target: _constants.TaskState.CONNECTED,
|
|
471
|
+
actions: ['updateTaskData', 'handleConsultFailed']
|
|
472
|
+
}],
|
|
402
473
|
// AgentConsultEnded
|
|
403
474
|
[_constants.TaskEvent.CONSULT_END]: [{
|
|
404
475
|
// Initiator returning to conference only while conference is still active.
|
|
@@ -627,6 +698,11 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
627
698
|
target: _constants.TaskState.CONSULT_INITIATING,
|
|
628
699
|
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference']
|
|
629
700
|
},
|
|
701
|
+
// AgentConsulting while still in conference (EP-DN/external ordering).
|
|
702
|
+
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
703
|
+
target: _constants.TaskState.CONSULTING,
|
|
704
|
+
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference', 'setConsultAgentJoined', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
705
|
+
},
|
|
630
706
|
// Participant leaves - handle conference downgrade scenarios
|
|
631
707
|
[_constants.TaskEvent.PARTICIPANT_LEAVE]: [{
|
|
632
708
|
// Only the leaving agent should wrap up → WRAPPING_UP
|