@webex/contact-center 3.12.0-task-refactor.5 → 3.12.0-task-refactor.6
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/TaskUtils.js +8 -6
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/state-machine/TaskStateMachine.js +71 -13
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
- package/dist/services/task/state-machine/actions.js +85 -13
- package/dist/services/task/state-machine/actions.js.map +1 -1
- package/dist/services/task/state-machine/guards.js +35 -0
- package/dist/services/task/state-machine/guards.js.map +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js +69 -7
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1 -1
- package/dist/services/task/voice/Voice.js.map +1 -1
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +60 -8
- package/dist/types/services/task/state-machine/guards.d.ts +5 -0
- package/dist/webex.js +1 -1
- package/package.json +1 -1
- package/src/services/task/TaskUtils.ts +8 -6
- package/src/services/task/state-machine/TaskStateMachine.ts +94 -15
- package/src/services/task/state-machine/actions.ts +148 -24
- package/src/services/task/state-machine/guards.ts +46 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +150 -9
- package/src/services/task/voice/Voice.ts +4 -1
- package/test/unit/spec/services/WebCallingService.ts +7 -1
- package/test/unit/spec/services/task/TaskUtils.ts +16 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +512 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +88 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +929 -0
- package/test/unit/spec/services/task/voice/Voice.ts +20 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -18,12 +18,13 @@ var _constants2 = require("./state-machine/constants");
|
|
|
18
18
|
* @returns true if customer is in the call
|
|
19
19
|
*/
|
|
20
20
|
const getIsCustomerInCall = (interaction, interactionId) => {
|
|
21
|
-
const mainCallMedia = interaction.media[interactionId];
|
|
22
|
-
|
|
21
|
+
const mainCallMedia = interaction.media?.[interactionId];
|
|
22
|
+
const participants = interaction.participants;
|
|
23
|
+
if (!mainCallMedia?.participants || !participants) {
|
|
23
24
|
return false;
|
|
24
25
|
}
|
|
25
26
|
return mainCallMedia.participants.some(participantId => {
|
|
26
|
-
const participant =
|
|
27
|
+
const participant = participants[participantId];
|
|
27
28
|
return participant?.pType === _constants2.PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;
|
|
28
29
|
});
|
|
29
30
|
};
|
|
@@ -38,13 +39,14 @@ const getIsCustomerInCall = (interaction, interactionId) => {
|
|
|
38
39
|
*/
|
|
39
40
|
exports.getIsCustomerInCall = getIsCustomerInCall;
|
|
40
41
|
const getConferenceParticipantsCount = (interaction, interactionId) => {
|
|
41
|
-
const mainCallMedia = interaction.media[interactionId];
|
|
42
|
-
|
|
42
|
+
const mainCallMedia = interaction.media?.[interactionId];
|
|
43
|
+
const participants = interaction.participants;
|
|
44
|
+
if (!mainCallMedia?.participants || !participants) {
|
|
43
45
|
return 0;
|
|
44
46
|
}
|
|
45
47
|
let count = 0;
|
|
46
48
|
for (const participantId of mainCallMedia.participants) {
|
|
47
|
-
const participant =
|
|
49
|
+
const participant = participants[participantId];
|
|
48
50
|
if (participant && participant.pType !== _constants2.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants2.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants2.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
|
|
49
51
|
count += 1;
|
|
50
52
|
}
|
|
@@ -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 if (!mainCallMedia?.participants) {\n return false;\n }\n\n return mainCallMedia.participants.some((participantId: string) => {\n const participant = interaction.participants[participantId];\n\n return participant?.pType === PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;\n });\n};\n\n/**\n * Gets the count of active agent participants in the conference\n * Excludes Customer, Supervisor, and VVA participant types\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns Number of active agent participants\n */\nexport const getConferenceParticipantsCount = (\n interaction: Interaction,\n interactionId: string\n): number => {\n const mainCallMedia = interaction.media[interactionId];\n if (!mainCallMedia?.participants) {\n return 0;\n }\n\n let count = 0;\n for (const participantId of mainCallMedia.participants) {\n const participant = interaction.participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n count += 1;\n }\n }\n\n return count;\n};\n\n/**\n * Determines if a consult is actively in-progress for conference control gating.\n * This is used to disable conference controls (End/Consult) only when a consult leg\n * still exists outside the main call participants.\n */\nexport const getIsConsultInProgressForConferenceControls = (\n interaction: Interaction | undefined,\n mainCallId: string | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!interaction || !mainCallId) return false;\n\n const mainParticipants = interaction.media?.[mainCallId]?.participants;\n if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;\n\n const mainSet = new Set(mainParticipants);\n const media = interaction.media;\n if (!media) return false;\n\n return Object.values(media).some((m: any) => {\n if (!m || m.mType !== 'consult') return false;\n if (!Array.isArray(m.participants) || m.participants.length === 0) return false;\n\n return m.participants.some((participantId: string) => {\n const p: any = interaction.participants?.[participantId];\n if (!p || p.hasLeft) return false;\n if (selfAgentId && participantId === selfAgentId) return false;\n\n const consultLegActive =\n p.consultState === 'consulting' ||\n p.isConsulted === true ||\n p.currentState === 'consulting';\n\n return consultLegActive && !mainSet.has(participantId);\n });\n });\n};\n\nexport const getIsConsultedAgentForControls = (\n taskData: TaskData | null,\n context: TaskContext,\n isConsultingState: boolean\n): boolean => {\n return Boolean(taskData?.isConsulted) || (isConsultingState && !context.consultInitiator);\n};\n\nexport const getServerHoldStateForControls = (\n context: TaskContext,\n mainCallId?: string,\n fallbackTaskData?: TaskData | null\n): boolean | undefined => {\n const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;\n if (!media) return undefined;\n\n if (mainCallId && media[mainCallId]) {\n return media[mainCallId].isHold ?? false;\n }\n\n const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;\n if (!mediaId) return undefined;\n\n return media[mediaId]?.isHold;\n};\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj &&\n mediaObj.mType === MEDIA_TYPE_MAIN_CALL &&\n mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param data - The task data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n *\n * For Agent B (consulted agent), their task's interactionId may be different from the main call.\n * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n if (!data.interaction) return false;\n\n const mainCallId = data.interaction.mainInteractionId || data.interactionId;\n const mediaMainCall = data.interaction.media?.[mainCallId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const {participants} = data.interaction;\n\n const agentParticipants = new Set();\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n agentParticipants.add(participantId);\n }\n });\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param interaction - The interaction object\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Gets the consult media resource ID for switch-call operations.\n * Searches for the consult media leg in the interaction.\n *\n * @param interaction - The interaction object\n * @param consultMediaResourceId - The consult media resource ID from task data\n * @param agentId - Current agent ID\n * @returns The consult media resource ID or undefined\n */\nexport const getConsultMediaResourceId = (\n interaction: Interaction | undefined,\n consultMediaResourceId: string | undefined,\n agentId: string | undefined\n): string | undefined => {\n // First priority: use consultMediaResourceId from task data if available\n if (consultMediaResourceId) {\n return consultMediaResourceId;\n }\n\n // Second priority: search for consult media leg in interaction.media\n if (!interaction?.media || !agentId) {\n return undefined;\n }\n\n // Find the consult media leg where this agent is a participant\n for (const [mediaId, media] of Object.entries(interaction.media)) {\n if (media.mType === 'consult' && media.participants?.includes(agentId)) {\n return mediaId;\n }\n }\n\n return undefined;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
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":[]}
|
|
@@ -121,7 +121,7 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
121
121
|
// Do not drop it in IDLE; bootstrap to CONSULTING using event taskData.
|
|
122
122
|
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
123
123
|
target: _constants.TaskState.CONSULTING,
|
|
124
|
-
actions: ['
|
|
124
|
+
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference', 'setConsultAgentJoined', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
},
|
|
@@ -175,7 +175,7 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
175
175
|
// AgentConsulting comes for received after the initial consult is accepted
|
|
176
176
|
[_constants.TaskEvent.CONSULTING_ACTIVE]: [{
|
|
177
177
|
target: _constants.TaskState.CONSULTING,
|
|
178
|
-
actions: ['
|
|
178
|
+
actions: ['setConsultAgentJoined', 'setConsultDestination', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
179
179
|
}],
|
|
180
180
|
// agentOfferConsult happens only on the receiver side of consult
|
|
181
181
|
[_constants.TaskEvent.OFFER_CONSULT]: {
|
|
@@ -197,11 +197,16 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
197
197
|
},
|
|
198
198
|
[_constants.TaskState.CONNECTED]: {
|
|
199
199
|
on: {
|
|
200
|
+
// AgentConsultConferenced / ParticipantJoinedConference can arrive while connected.
|
|
201
|
+
[_constants.TaskEvent.CONFERENCE_START]: {
|
|
202
|
+
target: _constants.TaskState.CONFERENCING,
|
|
203
|
+
actions: ['updateTaskData', 'syncTaskDataFromEvent', 'clearConsultState', 'emitTaskConferenceStarted']
|
|
204
|
+
},
|
|
200
205
|
// AgentConsulting may arrive while machine is CONNECTED (EP-DN/event ordering).
|
|
201
206
|
// Derive consultInitiator from payload so controls are set correctly.
|
|
202
207
|
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
203
208
|
target: _constants.TaskState.CONSULTING,
|
|
204
|
-
actions: ['
|
|
209
|
+
actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultAgentJoined', 'updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting']
|
|
205
210
|
},
|
|
206
211
|
// AgentContactAssigned can be resent after consult transfers; keep context in sync
|
|
207
212
|
[_constants.TaskEvent.ASSIGN]: {
|
|
@@ -278,6 +283,17 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
278
283
|
},
|
|
279
284
|
[_constants.TaskState.HELD]: {
|
|
280
285
|
on: {
|
|
286
|
+
// Conference can be merged while this agent is in held state after refresh/recovery.
|
|
287
|
+
[_constants.TaskEvent.CONFERENCE_START]: {
|
|
288
|
+
target: _constants.TaskState.CONFERENCING,
|
|
289
|
+
actions: ['updateTaskData', 'syncTaskDataFromEvent', 'clearConsultState', 'emitTaskConferenceStarted']
|
|
290
|
+
},
|
|
291
|
+
[_constants.TaskEvent.PAUSE_RECORDING]: {
|
|
292
|
+
actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingPaused']
|
|
293
|
+
},
|
|
294
|
+
[_constants.TaskEvent.RESUME_RECORDING]: {
|
|
295
|
+
actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingResumed']
|
|
296
|
+
},
|
|
281
297
|
// Click of the unhold button
|
|
282
298
|
[_constants.TaskEvent.UNHOLD_INITIATED]: {
|
|
283
299
|
target: _constants.TaskState.RESUME_INITIATING
|
|
@@ -381,20 +397,48 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
381
397
|
on: {
|
|
382
398
|
// AgentConsulting updates consulted agent arrival
|
|
383
399
|
[_constants.TaskEvent.CONSULTING_ACTIVE]: {
|
|
384
|
-
actions: ['
|
|
400
|
+
actions: ['setConsultAgentJoined', 'setConsultDestination', 'updateTaskData', 'emitTaskConsulting']
|
|
385
401
|
},
|
|
386
402
|
// AgentConsultEnded
|
|
387
403
|
[_constants.TaskEvent.CONSULT_END]: [{
|
|
388
|
-
// Initiator returning to conference
|
|
404
|
+
// Initiator returning to conference only while conference is still active.
|
|
389
405
|
guard: ({
|
|
390
406
|
context,
|
|
391
407
|
event
|
|
392
|
-
}) => context.consultInitiator === true &&
|
|
408
|
+
}) => context.consultInitiator === true && _guards.guards.conferenceInProgressFromEvent({
|
|
393
409
|
context,
|
|
394
410
|
event
|
|
395
|
-
})
|
|
411
|
+
}),
|
|
396
412
|
target: _constants.TaskState.CONFERENCING,
|
|
397
413
|
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
414
|
+
}, {
|
|
415
|
+
// Conference consult ended after conference downgrade while main leg is held.
|
|
416
|
+
guard: ({
|
|
417
|
+
context,
|
|
418
|
+
event
|
|
419
|
+
}) => context.consultInitiator === true && context.consultFromConference === true && !_guards.guards.conferenceInProgressFromEvent({
|
|
420
|
+
context,
|
|
421
|
+
event
|
|
422
|
+
}) && _guards.guards.isConferenceHoldParticipantFromEvent({
|
|
423
|
+
context,
|
|
424
|
+
event
|
|
425
|
+
}),
|
|
426
|
+
target: _constants.TaskState.HELD,
|
|
427
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
428
|
+
}, {
|
|
429
|
+
// Conference consult ended after conference downgrade while main leg is connected.
|
|
430
|
+
guard: ({
|
|
431
|
+
context,
|
|
432
|
+
event
|
|
433
|
+
}) => context.consultInitiator === true && context.consultFromConference === true && !_guards.guards.conferenceInProgressFromEvent({
|
|
434
|
+
context,
|
|
435
|
+
event
|
|
436
|
+
}) && !_guards.guards.isConferenceHoldParticipantFromEvent({
|
|
437
|
+
context,
|
|
438
|
+
event
|
|
439
|
+
}),
|
|
440
|
+
target: _constants.TaskState.CONNECTED,
|
|
441
|
+
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
398
442
|
}, {
|
|
399
443
|
// Initiator already switched back to the main/customer leg
|
|
400
444
|
guard: ({
|
|
@@ -403,15 +447,17 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
403
447
|
target: _constants.TaskState.CONNECTED,
|
|
404
448
|
actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd']
|
|
405
449
|
}, {
|
|
406
|
-
//
|
|
450
|
+
// Interaction terminated during consult (customer left) → WRAPPING_UP
|
|
407
451
|
guard: ({
|
|
408
452
|
context,
|
|
409
453
|
event
|
|
410
454
|
}) => {
|
|
455
|
+
// if (context.consultInitiator !== true) return false;
|
|
456
|
+
// const taskData = getTaskDataFromEvent(event);
|
|
411
457
|
const taskData = (0, _guards.getTaskDataFromEvent)(event);
|
|
412
458
|
const cpd = taskData?.interaction?.callProcessingDetails;
|
|
413
459
|
if (cpd?.hasCustomerLeft !== 'true') return false;
|
|
414
|
-
return (0, _guards.shouldWrapUpForThisAgent)(context, taskData);
|
|
460
|
+
return taskData?.interaction?.isTerminated === true && (0, _guards.shouldWrapUpForThisAgent)(context, taskData);
|
|
415
461
|
},
|
|
416
462
|
target: _constants.TaskState.WRAPPING_UP,
|
|
417
463
|
actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup', 'requestCleanup']
|
|
@@ -558,12 +604,24 @@ function getTaskStateMachineConfig(uiControlConfig) {
|
|
|
558
604
|
}, {
|
|
559
605
|
actions: ['updateTaskData', 'clearConsultState']
|
|
560
606
|
}],
|
|
561
|
-
[_constants.TaskEvent.HOLD_SUCCESS]: {
|
|
607
|
+
[_constants.TaskEvent.HOLD_SUCCESS]: [{
|
|
608
|
+
// Conference already downgraded (no other agents) and backend hold arrives.
|
|
609
|
+
// Move to HELD so the UI renders resume action.
|
|
610
|
+
guard: _guards.guards.shouldDowngradeConferenceToConnected,
|
|
611
|
+
target: _constants.TaskState.HELD,
|
|
562
612
|
actions: ['updateTaskData', 'setHoldState', 'emitTaskHold']
|
|
563
|
-
},
|
|
564
|
-
|
|
613
|
+
}, {
|
|
614
|
+
actions: ['updateTaskData', 'setHoldState', 'emitTaskHold']
|
|
615
|
+
}],
|
|
616
|
+
[_constants.TaskEvent.UNHOLD_SUCCESS]: [{
|
|
617
|
+
// Conference already downgraded (no other agents) and backend unhold arrives.
|
|
618
|
+
// Move to CONNECTED so hold action is available again.
|
|
619
|
+
guard: _guards.guards.shouldDowngradeConferenceToConnected,
|
|
620
|
+
target: _constants.TaskState.CONNECTED,
|
|
565
621
|
actions: ['updateTaskData', 'syncTaskDataFromEvent', 'setHoldState', 'emitTaskResume']
|
|
566
|
-
},
|
|
622
|
+
}, {
|
|
623
|
+
actions: ['updateTaskData', 'syncTaskDataFromEvent', 'setHoldState', 'emitTaskResume']
|
|
624
|
+
}],
|
|
567
625
|
// Start a new consult from within an active conference
|
|
568
626
|
[_constants.TaskEvent.CONSULT]: {
|
|
569
627
|
target: _constants.TaskState.CONSULT_INITIATING,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_xstate","require","_constants","_actions","_guards","_TaskUtils","taskStateMachineSetup","setup","actors","types","context","events","getTaskStateMachineConfig","uiControlConfig","id","initial","TaskState","IDLE","createInitialContext","on","TaskEvent","RECORDING_STARTED","actions","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","HYDRATE","states","guard","guards","isInteractionTerminated","target","WRAPPING_UP","isInteractionConsulting","CONSULTING","isInteractionHeld","HELD","isInteractionConnected","CONNECTED","isConferencingByParticipants","CONFERENCING","TASK_INCOMING","OFFERED","OUTBOUND_FAILED","TERMINATED","CONSULTING_ACTIVE","TASK_OFFERED","ASSIGN","isConsultingAssignment","RONA","TASK_WRAPUP","CONTACT_ENDED","ASSIGN_FAILED","INVITE_FAILED","shouldWrapUp","OFFER_CONSULT","CONSULT_FAILED","CONSULT_END","HOLD_INITIATED","HOLD_INITIATING","HOLD_SUCCESS","CONSULT","CONSULT_INITIATING","TRANSFER_SUCCESS","shouldWrapUpOrIsInitiator","TRANSFER_FAILED","conferenceInProgressFromEvent","PAUSE_RECORDING","RESUME_RECORDING","HOLD_FAILED","UNHOLD_INITIATED","RESUME_INITIATING","UNHOLD_SUCCESS","UNHOLD_FAILED","CONSULT_SUCCESS","consultFromConference","isPrimaryMediaOnHold","CTQ_CANCEL","event","consultInitiator","consultCallHeld","taskData","getTaskDataFromEvent","cpd","interaction","callProcessingDetails","hasCustomerLeft","shouldWrapUpForThisAgent","SWITCH_TO_MAIN_CALL","SWITCH_TO_CONSULT","TRANSFER_CONFERENCE","TRANSFER_CONFERENCE_SUCCESS","transferConferenceRequested","TRANSFER_CONFERENCE_FAILED","MERGE_TO_CONFERENCE","CONF_INITIATING","CONFERENCE_START","CONFERENCE_FAILED","isTerminated","EXIT_CONFERENCE_SUCCESS","PARTICIPANT_LEAVE","params","didCurrentAgentLeaveConference","shouldDowngradeConferenceToConnected","CONFERENCE_END","exitingConference","mainCallId","mainInteractionId","interactionId","getIsCustomerInCall","entry","WRAPUP_COMPLETE","COMPLETED","type","createTaskStateMachine","options","createMachine","provide"],"sources":["TaskStateMachine.ts"],"sourcesContent":["/**\n * Task State Machine Configuration\n *\n * This file defines the XState state machine configuration for contact center tasks.\n * It orchestrates state transitions, guards, and actions for task lifecycle management.\n *\n * GUARD FUNCTIONS: All guard logic is centralized in guards.ts for reusability and testing.\n * This file imports and uses those guards via the `guards` object.\n */\n\nimport {setup} from 'xstate';\nimport {TaskContext, TaskEventPayload, UIControlConfig, TaskActionsMap} from './types';\nimport {TaskState, TaskEvent} from './constants';\nimport {actions, createInitialContext} from './actions';\nimport {guards, shouldWrapUpForThisAgent, getTaskDataFromEvent} from './guards';\nimport {getIsCustomerInCall} from '../TaskUtils';\n\ntype TaskActionConfigMap = {[K in keyof typeof actions]: undefined};\n\nconst taskStateMachineSetup = setup<\n TaskContext,\n TaskEventPayload,\n Record<string, never>,\n Record<string, never>,\n TaskActionConfigMap\n>({\n actors: {},\n types: {\n context: {} as TaskContext,\n events: {} as TaskEventPayload,\n },\n});\n\n/**\n * Get task state machine configuration with UI control config\n * Defines all states, transitions, guards, and actions for task management\n *\n * @param uiControlConfig - UI control configuration\n * @returns State machine configuration object\n */\nexport function getTaskStateMachineConfig(uiControlConfig: UIControlConfig) {\n /**\n * Event mapping reference (CC WebSocket -> TaskEvent)\n *\n * AgentContactReserved -> TaskEvent.TASK_INCOMING\n * AgentOfferContact -> TaskEvent.TASK_OFFERED\n * AgentOfferConsult -> TaskEvent.OFFER_CONSULT\n * AgentConsulting -> TaskEvent.CONSULTING_ACTIVE\n * AgentConsultCreated -> TaskEvent.CONSULT_CREATED\n * AgentConsultTransferred -> TaskEvent.TRANSFER_SUCCESS\n * AgentContactAssigned -> TaskEvent.ASSIGN\n * AgentContactHeld -> TaskEvent.HOLD_SUCCESS\n * AgentContactUnheld -> TaskEvent.UNHOLD_SUCCESS\n * AgentConsultEnded -> TaskEvent.CONSULT_END\n * AgentContactEnded -> TaskEvent.CONTACT_ENDED\n * AgentWrapup -> TaskEvent.TASK_WRAPUP (wrapUpRequired)\n * AgentWrappedup -> TaskEvent.WRAPUP_COMPLETE\n *\n * (See TaskManager.mapEventToTaskStateMachineEvent for the full mapping table.)\n */\n return {\n id: 'taskStateMachine',\n initial: TaskState.IDLE,\n context: createInitialContext(uiControlConfig, TaskState.IDLE),\n on: {\n [TaskEvent.RECORDING_STARTED]: {\n actions: ['updateTaskData', 'emitTaskRecordingStarted'],\n },\n [TaskEvent.CONTACT_UPDATED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n [TaskEvent.CONTACT_OWNER_CHANGED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n // HYDRATE: Update task data from AgentContact event\n // Note: State restoration with transitions is handled in IDLE state.\n // This root-level handler is for when task is already in another state (just updates data).\n [TaskEvent.HYDRATE]: {\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n },\n states: {\n [TaskState.IDLE]: {\n on: {\n // HYDRATE: Restore state machine to correct state based on hydrated task data\n // This handles page refresh/reconnection scenarios where task needs to be restored\n // IMPORTANT: This MUST be in IDLE state (not root) because root-level events cannot\n // transition to child states in XState\n [TaskEvent.HYDRATE]: [\n {\n guard: guards.isInteractionTerminated,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConsulting,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionHeld,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConnected,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isConferencingByParticipants,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n // Default: just update data, stay in IDLE\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n ],\n // AgentContactReserved (applicable for direct incoming/consult/transfer/outdial)\n [TaskEvent.TASK_INCOMING]: {\n target: TaskState.OFFERED,\n actions: ['initializeTask', 'emitTaskIncoming'],\n },\n\n // AgentOutboundFailed can arrive before TASK_INCOMING due to race conditions\n [TaskEvent.OUTBOUND_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskEnd'],\n },\n\n // EP-DN split-leg ordering can deliver AgentConsulting before HYDRATE/TASK_INCOMING.\n // Do not drop it in IDLE; bootstrap to CONSULTING using event taskData.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultFromConference',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n },\n },\n\n [TaskState.OFFERED]: {\n on: {\n // AgentContactOffer\n [TaskEvent.TASK_OFFERED]: {\n actions: ['updateTaskData', 'emitTaskOfferContact', 'requestAutoAnswer'],\n },\n // AgentContactAssigned\n [TaskEvent.ASSIGN]: [\n {\n guard: guards.isConsultingAssignment,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n ],\n // AgentOfferContactRONA\n [TaskEvent.RONA]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n // This needs to be handled for all assign failed scenarios (contact, buddy)\n // [AgentContactAssignFailed, AgentCtqFailed, AgentBlindTransferFailed,\n // AgentVTeamTransferFailed, AgentConsultTransferFailed]\n [TaskEvent.ASSIGN_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.INVITE_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.OUTBOUND_FAILED]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskEnd'],\n },\n ],\n // AgentConsulting comes for received after the initial consult is accepted\n [TaskEvent.CONSULTING_ACTIVE]: [\n {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n ],\n // agentOfferConsult happens only on the receiver side of consult\n [TaskEvent.OFFER_CONSULT]: {\n actions: ['updateTaskData', 'emitTaskOfferConsult', 'requestAutoAnswer'],\n },\n // AgentConsultFailed - when consulted agent (Agent 2) doesn't answer (RONA or decline)\n // Clears the incoming consult notification by transitioning to TERMINATED\n [TaskEvent.CONSULT_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n // AgentConsultEnded - when consult initiator (Agent 1) ends the consult before\n // the consulted agent (Agent 2) accepts. Clears the incoming notification.\n [TaskEvent.CONSULT_END]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n },\n },\n\n [TaskState.CONNECTED]: {\n on: {\n // AgentConsulting may arrive while machine is CONNECTED (EP-DN/event ordering).\n // Derive consultInitiator from payload so controls are set correctly.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n // AgentContactAssigned can be resent after consult transfers; keep context in sync\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // Click of hold button\n [TaskEvent.HOLD_INITIATED]: {\n target: TaskState.HOLD_INITIATING,\n },\n // Remote hold from another login session (multi-login)\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Receiver goes to connected as he receives transferSuccess event\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n // AgentContactEnded Event\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → CONFERENCING\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n // Agent should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n [TaskEvent.PAUSE_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingPaused'],\n },\n [TaskEvent.RESUME_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingResumed'],\n },\n },\n },\n\n [TaskState.HOLD_INITIATING]: {\n on: {\n // AgentContactHeld Event\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // AgentContactHoldFailed Event\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.HELD]: {\n on: {\n // Click of the unhold button\n [TaskEvent.UNHOLD_INITIATED]: {\n target: TaskState.RESUME_INITIATING,\n },\n // Remote resume from another login session (multi-login)\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // TODO: This may not be a valid transition, need to be removed\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.CONTACT_ENDED]: [\n {\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n // TODO: This may not be a valid transition, this needs to be checked as well\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n },\n },\n\n [TaskState.RESUME_INITIATING]: {\n on: {\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n [TaskEvent.UNHOLD_FAILED]: {\n target: TaskState.HELD,\n },\n },\n },\n\n [TaskState.CONSULT_INITIATING]: {\n on: {\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n // AgentConsulting\n // NOTE: Don't set consultDestinationAgentJoined here - wait for CONSULTING_ACTIVE\n [TaskEvent.CONSULT_SUCCESS]: {\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'setConsultInitiator'],\n },\n // AgentConsultFailed, API Failures, AgentCtqFailed\n [TaskEvent.CONSULT_FAILED]: [\n {\n // Consult from conference → back to CONFERENCING\n guard: ({context}) => context.consultFromConference === true,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n ],\n // AgentCtqCancelled Event\n [TaskEvent.CTQ_CANCEL]: [\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n },\n },\n\n [TaskState.CONSULTING]: {\n on: {\n // AgentConsulting updates consulted agent arrival\n [TaskEvent.CONSULTING_ACTIVE]: {\n actions: [\n 'updateTaskData',\n 'setConsultAgentJoined',\n 'setConsultDestination',\n 'emitTaskConsulting',\n ],\n },\n\n // AgentConsultEnded\n [TaskEvent.CONSULT_END]: [\n {\n // Initiator returning to conference (flag set OR backend still shows conference)\n guard: ({context, event}) =>\n context.consultInitiator === true &&\n (context.consultFromConference === true ||\n guards.conferenceInProgressFromEvent({context, event})),\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Initiator already switched back to the main/customer leg\n guard: ({context}) =>\n context.consultInitiator === true && context.consultCallHeld === true,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Customer left during consult → WRAPPING_UP\n guard: ({context, event}) => {\n const taskData = getTaskDataFromEvent(event);\n const cpd = taskData?.interaction?.callProcessingDetails;\n if (cpd?.hasCustomerLeft !== 'true') return false;\n\n return shouldWrapUpForThisAgent(context, taskData);\n },\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskWrapup',\n 'requestCleanup',\n ],\n },\n {\n // Initiator (no conference) → HELD\n guard: ({context}) => context.consultInitiator === true,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData'],\n },\n ],\n\n // Switch between consult and main call (UI-driven toggle)\n [TaskEvent.SWITCH_TO_MAIN_CALL]: {\n actions: ['handleSwitchToMainCall', 'emitTaskSwitchCall'],\n },\n [TaskEvent.SWITCH_TO_CONSULT]: {\n actions: ['handleSwitchToConsult', 'emitTaskSwitchCall'],\n },\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n [TaskEvent.UNHOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.TRANSFER_CONFERENCE]: {\n // Track that this agent initiated the conference transfer so we can\n // apply the correct lifecycle transition when success arrives.\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskWrapup',\n ],\n },\n {\n // Non-initiator (consulted agent) stays in CONFERENCING\n guard: ({context}) => !context.consultInitiator,\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskEnd',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // AgentContactAssigned - receiver side becomes connected to customer\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // AgentContactEnded\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskWrapup',\n 'requestCleanup',\n ],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n [TaskEvent.MERGE_TO_CONFERENCE]: {\n target: TaskState.CONF_INITIATING,\n },\n // AgentConsultConferenced, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'handleConferenceStarted',\n 'clearConsultState',\n ],\n },\n },\n },\n\n [TaskState.CONF_INITIATING]: {\n on: {\n // AgentConsultConferenced, AgentConsultConferencing, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'handleConferenceStarted',\n 'clearConsultState',\n ],\n },\n // AgentConsultConferenceFailed\n [TaskEvent.CONFERENCE_FAILED]: {\n target: TaskState.CONSULTING,\n actions: ['handleConferenceFailed', 'emitTaskConferenceFailed'],\n },\n // AgentConsultEnded while conference is initiating (end call before conference completes)\n [TaskEvent.CONSULT_END]: [\n {\n guard: ({event}) => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData?.interaction?.isTerminated === true;\n },\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n },\n },\n\n [TaskState.CONFERENCING]: {\n on: {\n [TaskEvent.CONFERENCE_START]: {\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'clearConsultState',\n 'emitTaskConferenceStarted',\n ],\n },\n [TaskEvent.EXIT_CONFERENCE_SUCCESS]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // Needed as all agents in conference get this event, hence we need to clear the consult state\n [TaskEvent.CONSULT_END]: [\n {\n guard: ({context, event}) => {\n const taskData = getTaskDataFromEvent(event);\n\n return (\n taskData?.interaction?.isTerminated === true &&\n shouldWrapUpForThisAgent(context, taskData)\n );\n },\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n [TaskEvent.UNHOLD_SUCCESS]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent', 'setHoldState', 'emitTaskResume'],\n },\n\n // Start a new consult from within an active conference\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference'],\n },\n\n // Participant leaves - handle conference downgrade scenarios\n [TaskEvent.PARTICIPANT_LEAVE]: [\n {\n // Only the leaving agent should wrap up → WRAPPING_UP\n guard: (params) =>\n guards.didCurrentAgentLeaveConference(params) && guards.shouldWrapUp(params),\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskWrapup',\n ],\n },\n {\n // Only the leaving agent (no wrapup) → TERMINATED\n guard: guards.didCurrentAgentLeaveConference,\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskEnd',\n ],\n },\n {\n // Conference downgraded, customer present → CONNECTED\n guard: (params) =>\n !guards.didCurrentAgentLeaveConference(params) &&\n guards.shouldDowngradeConferenceToConnected(params),\n target: TaskState.CONNECTED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskConferenceEnded',\n ],\n },\n {actions: ['updateTaskData', 'handleParticipantLeft', 'emitTaskParticipantLeft']},\n ],\n\n [TaskEvent.TRANSFER_CONFERENCE]: {\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n // Not initiated by this agent → just refresh backend state.\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // Conference ends explicitly\n [TaskEvent.CONFERENCE_END]: [\n {\n // Agent who should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Customer still in call → CONNECTED\n guard: ({context, event}) => {\n if (context.exitingConference === true) return false;\n const taskData = (event as any)?.taskData ?? context.taskData;\n if (!taskData?.interaction) return false;\n const mainCallId = taskData.interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n return getIsCustomerInCall(taskData.interaction, mainCallId);\n },\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConferenceEnded'],\n },\n {\n // Otherwise → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // CONTACT_ENDED in conference\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → stay\n actions: ['updateTaskData', 'requestCleanup'],\n },\n ],\n },\n },\n\n [TaskState.WRAPPING_UP]: {\n // Only emit wrapup event on entry - task:end should only be emitted when COMPLETED\n entry: ['emitTaskWrapup'],\n on: {\n // AgentWrappedup Event\n [TaskEvent.WRAPUP_COMPLETE]: {\n target: TaskState.COMPLETED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.COMPLETED]: {\n type: 'final' as const,\n entry: ['emitTaskWrappedup', 'cleanupResources'],\n },\n\n [TaskState.TERMINATED]: {\n type: 'final' as const,\n entry: ['cleanupResources'],\n },\n },\n };\n}\n\n/**\n * Create a task state machine instance using only the built-in actions.\n * The resulting machine is ready for most consumers that rely on the default\n * context mutators declared in actions.ts.\n *\n * @param uiControlConfig - UI control configuration\n * @returns StateMachine instance for task management\n */\nexport function createTaskStateMachine(\n uiControlConfig: UIControlConfig,\n options?: {actions?: Partial<TaskActionsMap>}\n) {\n return taskStateMachineSetup.createMachine(getTaskStateMachineConfig(uiControlConfig)).provide({\n actions: {\n ...actions,\n ...(options?.actions ?? {}),\n },\n });\n}\n\nexport type TaskStateMachine = ReturnType<typeof createTaskStateMachine>;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_xstate","require","_constants","_actions","_guards","_TaskUtils","taskStateMachineSetup","setup","actors","types","context","events","getTaskStateMachineConfig","uiControlConfig","id","initial","TaskState","IDLE","createInitialContext","on","TaskEvent","RECORDING_STARTED","actions","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","HYDRATE","states","guard","guards","isInteractionTerminated","target","WRAPPING_UP","isInteractionConsulting","CONSULTING","isInteractionHeld","HELD","isInteractionConnected","CONNECTED","isConferencingByParticipants","CONFERENCING","TASK_INCOMING","OFFERED","OUTBOUND_FAILED","TERMINATED","CONSULTING_ACTIVE","TASK_OFFERED","ASSIGN","isConsultingAssignment","RONA","TASK_WRAPUP","CONTACT_ENDED","ASSIGN_FAILED","INVITE_FAILED","shouldWrapUp","OFFER_CONSULT","CONSULT_FAILED","CONSULT_END","CONFERENCE_START","HOLD_INITIATED","HOLD_INITIATING","HOLD_SUCCESS","CONSULT","CONSULT_INITIATING","TRANSFER_SUCCESS","shouldWrapUpOrIsInitiator","TRANSFER_FAILED","conferenceInProgressFromEvent","PAUSE_RECORDING","RESUME_RECORDING","HOLD_FAILED","UNHOLD_INITIATED","RESUME_INITIATING","UNHOLD_SUCCESS","UNHOLD_FAILED","CONSULT_SUCCESS","consultFromConference","isPrimaryMediaOnHold","CTQ_CANCEL","event","consultInitiator","isConferenceHoldParticipantFromEvent","consultCallHeld","taskData","getTaskDataFromEvent","cpd","interaction","callProcessingDetails","hasCustomerLeft","isTerminated","shouldWrapUpForThisAgent","SWITCH_TO_MAIN_CALL","SWITCH_TO_CONSULT","TRANSFER_CONFERENCE","TRANSFER_CONFERENCE_SUCCESS","transferConferenceRequested","TRANSFER_CONFERENCE_FAILED","MERGE_TO_CONFERENCE","CONF_INITIATING","CONFERENCE_FAILED","EXIT_CONFERENCE_SUCCESS","shouldDowngradeConferenceToConnected","PARTICIPANT_LEAVE","params","didCurrentAgentLeaveConference","CONFERENCE_END","exitingConference","mainCallId","mainInteractionId","interactionId","getIsCustomerInCall","entry","WRAPUP_COMPLETE","COMPLETED","type","createTaskStateMachine","options","createMachine","provide"],"sources":["TaskStateMachine.ts"],"sourcesContent":["/**\n * Task State Machine Configuration\n *\n * This file defines the XState state machine configuration for contact center tasks.\n * It orchestrates state transitions, guards, and actions for task lifecycle management.\n *\n * GUARD FUNCTIONS: All guard logic is centralized in guards.ts for reusability and testing.\n * This file imports and uses those guards via the `guards` object.\n */\n\nimport {setup} from 'xstate';\nimport {TaskContext, TaskEventPayload, UIControlConfig, TaskActionsMap} from './types';\nimport {TaskState, TaskEvent} from './constants';\nimport {actions, createInitialContext} from './actions';\nimport {guards, shouldWrapUpForThisAgent, getTaskDataFromEvent} from './guards';\nimport {getIsCustomerInCall} from '../TaskUtils';\n\ntype TaskActionConfigMap = {[K in keyof typeof actions]: undefined};\n\nconst taskStateMachineSetup = setup<\n TaskContext,\n TaskEventPayload,\n Record<string, never>,\n Record<string, never>,\n TaskActionConfigMap\n>({\n actors: {},\n types: {\n context: {} as TaskContext,\n events: {} as TaskEventPayload,\n },\n});\n\n/**\n * Get task state machine configuration with UI control config\n * Defines all states, transitions, guards, and actions for task management\n *\n * @param uiControlConfig - UI control configuration\n * @returns State machine configuration object\n */\nexport function getTaskStateMachineConfig(uiControlConfig: UIControlConfig) {\n /**\n * Event mapping reference (CC WebSocket -> TaskEvent)\n *\n * AgentContactReserved -> TaskEvent.TASK_INCOMING\n * AgentOfferContact -> TaskEvent.TASK_OFFERED\n * AgentOfferConsult -> TaskEvent.OFFER_CONSULT\n * AgentConsulting -> TaskEvent.CONSULTING_ACTIVE\n * AgentConsultCreated -> TaskEvent.CONSULT_CREATED\n * AgentConsultTransferred -> TaskEvent.TRANSFER_SUCCESS\n * AgentContactAssigned -> TaskEvent.ASSIGN\n * AgentContactHeld -> TaskEvent.HOLD_SUCCESS\n * AgentContactUnheld -> TaskEvent.UNHOLD_SUCCESS\n * AgentConsultEnded -> TaskEvent.CONSULT_END\n * AgentContactEnded -> TaskEvent.CONTACT_ENDED\n * AgentWrapup -> TaskEvent.TASK_WRAPUP (wrapUpRequired)\n * AgentWrappedup -> TaskEvent.WRAPUP_COMPLETE\n *\n * (See TaskManager.mapEventToTaskStateMachineEvent for the full mapping table.)\n */\n return {\n id: 'taskStateMachine',\n initial: TaskState.IDLE,\n context: createInitialContext(uiControlConfig, TaskState.IDLE),\n on: {\n [TaskEvent.RECORDING_STARTED]: {\n actions: ['updateTaskData', 'emitTaskRecordingStarted'],\n },\n [TaskEvent.CONTACT_UPDATED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n [TaskEvent.CONTACT_OWNER_CHANGED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n // HYDRATE: Update task data from AgentContact event\n // Note: State restoration with transitions is handled in IDLE state.\n // This root-level handler is for when task is already in another state (just updates data).\n [TaskEvent.HYDRATE]: {\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n },\n states: {\n [TaskState.IDLE]: {\n on: {\n // HYDRATE: Restore state machine to correct state based on hydrated task data\n // This handles page refresh/reconnection scenarios where task needs to be restored\n // IMPORTANT: This MUST be in IDLE state (not root) because root-level events cannot\n // transition to child states in XState\n [TaskEvent.HYDRATE]: [\n {\n guard: guards.isInteractionTerminated,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConsulting,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionHeld,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConnected,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isConferencingByParticipants,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n // Default: just update data, stay in IDLE\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n ],\n // AgentContactReserved (applicable for direct incoming/consult/transfer/outdial)\n [TaskEvent.TASK_INCOMING]: {\n target: TaskState.OFFERED,\n actions: ['initializeTask', 'emitTaskIncoming'],\n },\n\n // AgentOutboundFailed can arrive before TASK_INCOMING due to race conditions\n [TaskEvent.OUTBOUND_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskEnd'],\n },\n\n // EP-DN split-leg ordering can deliver AgentConsulting before HYDRATE/TASK_INCOMING.\n // Do not drop it in IDLE; bootstrap to CONSULTING using event taskData.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultFromConference',\n 'setConsultAgentJoined',\n 'updateTaskData',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n },\n },\n\n [TaskState.OFFERED]: {\n on: {\n // AgentContactOffer\n [TaskEvent.TASK_OFFERED]: {\n actions: ['updateTaskData', 'emitTaskOfferContact', 'requestAutoAnswer'],\n },\n // AgentContactAssigned\n [TaskEvent.ASSIGN]: [\n {\n guard: guards.isConsultingAssignment,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n ],\n // AgentOfferContactRONA\n [TaskEvent.RONA]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n // This needs to be handled for all assign failed scenarios (contact, buddy)\n // [AgentContactAssignFailed, AgentCtqFailed, AgentBlindTransferFailed,\n // AgentVTeamTransferFailed, AgentConsultTransferFailed]\n [TaskEvent.ASSIGN_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.INVITE_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.OUTBOUND_FAILED]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskEnd'],\n },\n ],\n // AgentConsulting comes for received after the initial consult is accepted\n [TaskEvent.CONSULTING_ACTIVE]: [\n {\n target: TaskState.CONSULTING,\n actions: [\n 'setConsultAgentJoined',\n 'setConsultDestination',\n 'updateTaskData',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n ],\n // agentOfferConsult happens only on the receiver side of consult\n [TaskEvent.OFFER_CONSULT]: {\n actions: ['updateTaskData', 'emitTaskOfferConsult', 'requestAutoAnswer'],\n },\n // AgentConsultFailed - when consulted agent (Agent 2) doesn't answer (RONA or decline)\n // Clears the incoming consult notification by transitioning to TERMINATED\n [TaskEvent.CONSULT_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n // AgentConsultEnded - when consult initiator (Agent 1) ends the consult before\n // the consulted agent (Agent 2) accepts. Clears the incoming notification.\n [TaskEvent.CONSULT_END]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n },\n },\n\n [TaskState.CONNECTED]: {\n on: {\n // AgentConsultConferenced / ParticipantJoinedConference can arrive while connected.\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'clearConsultState',\n 'emitTaskConferenceStarted',\n ],\n },\n // AgentConsulting may arrive while machine is CONNECTED (EP-DN/event ordering).\n // Derive consultInitiator from payload so controls are set correctly.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultAgentJoined',\n 'updateTaskData',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n // AgentContactAssigned can be resent after consult transfers; keep context in sync\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // Click of hold button\n [TaskEvent.HOLD_INITIATED]: {\n target: TaskState.HOLD_INITIATING,\n },\n // Remote hold from another login session (multi-login)\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Receiver goes to connected as he receives transferSuccess event\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n // AgentContactEnded Event\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → CONFERENCING\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n // Agent should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n [TaskEvent.PAUSE_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingPaused'],\n },\n [TaskEvent.RESUME_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingResumed'],\n },\n },\n },\n\n [TaskState.HOLD_INITIATING]: {\n on: {\n // AgentContactHeld Event\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // AgentContactHoldFailed Event\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.HELD]: {\n on: {\n // Conference can be merged while this agent is in held state after refresh/recovery.\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'clearConsultState',\n 'emitTaskConferenceStarted',\n ],\n },\n [TaskEvent.PAUSE_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingPaused'],\n },\n [TaskEvent.RESUME_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingResumed'],\n },\n // Click of the unhold button\n [TaskEvent.UNHOLD_INITIATED]: {\n target: TaskState.RESUME_INITIATING,\n },\n // Remote resume from another login session (multi-login)\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // TODO: This may not be a valid transition, need to be removed\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.CONTACT_ENDED]: [\n {\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n // TODO: This may not be a valid transition, this needs to be checked as well\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n },\n },\n\n [TaskState.RESUME_INITIATING]: {\n on: {\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n [TaskEvent.UNHOLD_FAILED]: {\n target: TaskState.HELD,\n },\n },\n },\n\n [TaskState.CONSULT_INITIATING]: {\n on: {\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n // AgentConsulting\n // NOTE: Don't set consultDestinationAgentJoined here - wait for CONSULTING_ACTIVE\n [TaskEvent.CONSULT_SUCCESS]: {\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'setConsultInitiator'],\n },\n // AgentConsultFailed, API Failures, AgentCtqFailed\n [TaskEvent.CONSULT_FAILED]: [\n {\n // Consult from conference → back to CONFERENCING\n guard: ({context}) => context.consultFromConference === true,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n ],\n // AgentCtqCancelled Event\n [TaskEvent.CTQ_CANCEL]: [\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n },\n },\n\n [TaskState.CONSULTING]: {\n on: {\n // AgentConsulting updates consulted agent arrival\n [TaskEvent.CONSULTING_ACTIVE]: {\n actions: [\n 'setConsultAgentJoined',\n 'setConsultDestination',\n 'updateTaskData',\n 'emitTaskConsulting',\n ],\n },\n\n // AgentConsultEnded\n [TaskEvent.CONSULT_END]: [\n {\n // Initiator returning to conference only while conference is still active.\n guard: ({context, event}) =>\n context.consultInitiator === true &&\n guards.conferenceInProgressFromEvent({context, event}),\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Conference consult ended after conference downgrade while main leg is held.\n guard: ({context, event}) =>\n context.consultInitiator === true &&\n context.consultFromConference === true &&\n !guards.conferenceInProgressFromEvent({context, event}) &&\n guards.isConferenceHoldParticipantFromEvent({context, event}),\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Conference consult ended after conference downgrade while main leg is connected.\n guard: ({context, event}) =>\n context.consultInitiator === true &&\n context.consultFromConference === true &&\n !guards.conferenceInProgressFromEvent({context, event}) &&\n !guards.isConferenceHoldParticipantFromEvent({context, event}),\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Initiator already switched back to the main/customer leg\n guard: ({context}) =>\n context.consultInitiator === true && context.consultCallHeld === true,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Interaction terminated during consult (customer left) → WRAPPING_UP\n guard: ({context, event}) => {\n // if (context.consultInitiator !== true) return false;\n // const taskData = getTaskDataFromEvent(event);\n const taskData = getTaskDataFromEvent(event);\n const cpd = taskData?.interaction?.callProcessingDetails;\n if (cpd?.hasCustomerLeft !== 'true') return false;\n\n return (\n taskData?.interaction?.isTerminated === true &&\n shouldWrapUpForThisAgent(context, taskData)\n );\n },\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskWrapup',\n 'requestCleanup',\n ],\n },\n {\n // Initiator (no conference) → HELD\n guard: ({context}) => context.consultInitiator === true,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData'],\n },\n ],\n\n // Switch between consult and main call (UI-driven toggle)\n [TaskEvent.SWITCH_TO_MAIN_CALL]: {\n actions: ['handleSwitchToMainCall', 'emitTaskSwitchCall'],\n },\n [TaskEvent.SWITCH_TO_CONSULT]: {\n actions: ['handleSwitchToConsult', 'emitTaskSwitchCall'],\n },\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n [TaskEvent.UNHOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.TRANSFER_CONFERENCE]: {\n // Track that this agent initiated the conference transfer so we can\n // apply the correct lifecycle transition when success arrives.\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskWrapup',\n ],\n },\n {\n // Non-initiator (consulted agent) stays in CONFERENCING\n guard: ({context}) => !context.consultInitiator,\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskEnd',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // AgentContactAssigned - receiver side becomes connected to customer\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // AgentContactEnded\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskWrapup',\n 'requestCleanup',\n ],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n [TaskEvent.MERGE_TO_CONFERENCE]: {\n target: TaskState.CONF_INITIATING,\n },\n // AgentConsultConferenced, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'handleConferenceStarted',\n 'clearConsultState',\n ],\n },\n },\n },\n\n [TaskState.CONF_INITIATING]: {\n on: {\n // AgentConsultConferenced, AgentConsultConferencing, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'handleConferenceStarted',\n 'clearConsultState',\n ],\n },\n // AgentConsultConferenceFailed\n [TaskEvent.CONFERENCE_FAILED]: {\n target: TaskState.CONSULTING,\n actions: ['handleConferenceFailed', 'emitTaskConferenceFailed'],\n },\n // AgentConsultEnded while conference is initiating (end call before conference completes)\n [TaskEvent.CONSULT_END]: [\n {\n guard: ({event}) => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData?.interaction?.isTerminated === true;\n },\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n },\n },\n\n [TaskState.CONFERENCING]: {\n on: {\n [TaskEvent.CONFERENCE_START]: {\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'clearConsultState',\n 'emitTaskConferenceStarted',\n ],\n },\n [TaskEvent.EXIT_CONFERENCE_SUCCESS]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // Needed as all agents in conference get this event, hence we need to clear the consult state\n [TaskEvent.CONSULT_END]: [\n {\n guard: ({context, event}) => {\n const taskData = getTaskDataFromEvent(event);\n\n return (\n taskData?.interaction?.isTerminated === true &&\n shouldWrapUpForThisAgent(context, taskData)\n );\n },\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n\n [TaskEvent.HOLD_SUCCESS]: [\n {\n // Conference already downgraded (no other agents) and backend hold arrives.\n // Move to HELD so the UI renders resume action.\n guard: guards.shouldDowngradeConferenceToConnected,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n ],\n [TaskEvent.UNHOLD_SUCCESS]: [\n {\n // Conference already downgraded (no other agents) and backend unhold arrives.\n // Move to CONNECTED so hold action is available again.\n guard: guards.shouldDowngradeConferenceToConnected,\n target: TaskState.CONNECTED,\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'setHoldState',\n 'emitTaskResume',\n ],\n },\n {\n actions: [\n 'updateTaskData',\n 'syncTaskDataFromEvent',\n 'setHoldState',\n 'emitTaskResume',\n ],\n },\n ],\n\n // Start a new consult from within an active conference\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference'],\n },\n\n // Participant leaves - handle conference downgrade scenarios\n [TaskEvent.PARTICIPANT_LEAVE]: [\n {\n // Only the leaving agent should wrap up → WRAPPING_UP\n guard: (params) =>\n guards.didCurrentAgentLeaveConference(params) && guards.shouldWrapUp(params),\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskWrapup',\n ],\n },\n {\n // Only the leaving agent (no wrapup) → TERMINATED\n guard: guards.didCurrentAgentLeaveConference,\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskEnd',\n ],\n },\n {\n // Conference downgraded, customer present → CONNECTED\n guard: (params) =>\n !guards.didCurrentAgentLeaveConference(params) &&\n guards.shouldDowngradeConferenceToConnected(params),\n target: TaskState.CONNECTED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskConferenceEnded',\n ],\n },\n {actions: ['updateTaskData', 'handleParticipantLeft', 'emitTaskParticipantLeft']},\n ],\n\n [TaskEvent.TRANSFER_CONFERENCE]: {\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n // Not initiated by this agent → just refresh backend state.\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // Conference ends explicitly\n [TaskEvent.CONFERENCE_END]: [\n {\n // Agent who should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Customer still in call → CONNECTED\n guard: ({context, event}) => {\n if (context.exitingConference === true) return false;\n const taskData = (event as any)?.taskData ?? context.taskData;\n if (!taskData?.interaction) return false;\n const mainCallId = taskData.interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n return getIsCustomerInCall(taskData.interaction, mainCallId);\n },\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConferenceEnded'],\n },\n {\n // Otherwise → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // CONTACT_ENDED in conference\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → stay\n actions: ['updateTaskData', 'requestCleanup'],\n },\n ],\n },\n },\n\n [TaskState.WRAPPING_UP]: {\n // Only emit wrapup event on entry - task:end should only be emitted when COMPLETED\n entry: ['emitTaskWrapup'],\n on: {\n // AgentWrappedup Event\n [TaskEvent.WRAPUP_COMPLETE]: {\n target: TaskState.COMPLETED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.COMPLETED]: {\n type: 'final' as const,\n entry: ['emitTaskWrappedup', 'cleanupResources'],\n },\n\n [TaskState.TERMINATED]: {\n type: 'final' as const,\n entry: ['cleanupResources'],\n },\n },\n };\n}\n\n/**\n * Create a task state machine instance using only the built-in actions.\n * The resulting machine is ready for most consumers that rely on the default\n * context mutators declared in actions.ts.\n *\n * @param uiControlConfig - UI control configuration\n * @returns StateMachine instance for task management\n */\nexport function createTaskStateMachine(\n uiControlConfig: UIControlConfig,\n options?: {actions?: Partial<TaskActionsMap>}\n) {\n return taskStateMachineSetup.createMachine(getTaskStateMachineConfig(uiControlConfig)).provide({\n actions: {\n ...actions,\n ...(options?.actions ?? {}),\n },\n });\n}\n\nexport type TaskStateMachine = ReturnType<typeof createTaskStateMachine>;\n"],"mappings":"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","ignoreList":[]}
|