@webex/contact-center 3.12.0-task-refactor.7 → 3.12.0-task-refactor.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/services/task/Task.js +32 -0
  2. package/dist/services/task/Task.js.map +1 -1
  3. package/dist/services/task/TaskUtils.js +3 -1
  4. package/dist/services/task/TaskUtils.js.map +1 -1
  5. package/dist/services/task/state-machine/TaskStateMachine.js +76 -0
  6. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  7. package/dist/services/task/state-machine/actions.js +113 -23
  8. package/dist/services/task/state-machine/actions.js.map +1 -1
  9. package/dist/services/task/state-machine/uiControlsComputer.js +99 -21
  10. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  11. package/dist/types/services/task/Task.d.ts +10 -0
  12. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +110 -0
  13. package/dist/types/services/task/state-machine/actions.d.ts +2 -0
  14. package/dist/webex.js +1 -1
  15. package/package.json +1 -1
  16. package/src/services/task/Task.ts +34 -0
  17. package/src/services/task/TaskUtils.ts +5 -3
  18. package/src/services/task/state-machine/TaskStateMachine.ts +104 -0
  19. package/src/services/task/state-machine/actions.ts +151 -25
  20. package/src/services/task/state-machine/uiControlsComputer.ts +173 -30
  21. package/test/unit/spec/services/task/Task.ts +61 -0
  22. package/test/unit/spec/services/task/TaskUtils.ts +65 -0
  23. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +676 -0
  24. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +597 -0
  25. package/umd/contact-center.min.js +2 -2
  26. package/umd/contact-center.min.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_constants","_TaskUtils","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","getDefaultInteractionUIControls","accept","decline","hold","mute","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","getDefaultUIControls","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","interaction","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","Boolean","participants","Object","values","some","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","selfAgentId","agentId","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultInitiator","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","recordingControlsAvailable","isEpDnConsult","isConsultDestinationReady","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","isWrappingUp","WRAPPING_UP","selfInMainCall","media","includes","consultMedia","find","mediaResourceId","consultMediaResourceId","mType","selfParticipant","selfInConsultCall","conferenceActive","inConference","isSoleAgentOnCall","isConsulted","getIsConsultedAgentForControls","consultState","isActive","hasFullControls","consultOwnedBySelf","consultingAgentId","hasConsultMedia","selfConsultPendingOnConsultMedia","ownerParticipant","owner","undefined","otherAgentConsultInProgress","participant","id","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","callProcessingDetails","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","type","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","OFFERED","isTerminated","canHold","isEndTaskEnabled","isConnectedOrHeld","canFromConference","canFromConnected","isEndConsultEnabled","isRecordingEnabled","consultingFromConference","consultLegTransferAvailable","selfConsultingOnParticipantState","conferenceTransferAvailable","computeDigitalInteractionUIControls","getVoiceLegState","hasConsultLeg","mainState","isConsultingState","selfConsultingOnConsultMedia","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // Essential data\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const isWebrtc = config.voiceVariant === VOICE_VARIANT.WEBRTC;\n const isOutdial = interaction?.outboundType === 'OUTDIAL';\n const serverHold = getServerHoldStateForControls(context, mainCallId, fallbackTaskData);\n\n // Backend-derived checks\n const customerInCall =\n interaction && mainCallId ? getIsCustomerInCall(interaction, mainCallId) : false;\n // EP-DN/secondary legs can have incomplete media participant lists; fall back to participants map.\n const customerPresent =\n customerInCall ||\n Boolean(\n interaction &&\n interaction.participants &&\n Object.values(interaction.participants).some(\n (p: any) => p?.pType === 'Customer' && !p?.hasLeft\n )\n );\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n const maxParticipants = participantCount >= MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const conferenceFromBackend = taskData ? getIsConferenceInProgress(taskData) : false;\n // Note: ownership is used by some controls; keep computations local to those controls\n\n // Context flags (set by state machine actions)\n const {\n consultInitiator,\n consultDestinationAgentJoined,\n consultDestinationType,\n consultCallHeld,\n consultFromConference,\n } = context;\n const {recordingControlsAvailable} = context;\n\n // EP_DN consults are \"ready\" as soon as the consult is created (EP accepts routing immediately).\n // Backend sends destinationType as 'EP-DN'; SDK method uses 'entryPoint' — check both.\n const isEpDnConsult =\n consultDestinationType === 'entryPoint' || consultDestinationType === ('EP-DN' as any);\n const isConsultDestinationReady = consultDestinationAgentJoined || isEpDnConsult;\n\n const stateImpliesHeld = state === TaskState.HELD || state === TaskState.RESUME_INITIATING;\n const stateImpliesConnected =\n state === TaskState.CONNECTED || state === TaskState.HOLD_INITIATING;\n const isHeld = stateImpliesHeld || serverHold === true;\n const isConnected = stateImpliesConnected || (!stateImpliesHeld && serverHold === false);\n\n // State categories for cleaner logic\n const isConsulting =\n state === TaskState.CONSULTING ||\n state === TaskState.CONSULT_INITIATING ||\n state === TaskState.CONF_INITIATING;\n const isConferencing = state === TaskState.CONFERENCING;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n const selfInMainCall =\n Boolean(selfAgentId) &&\n Boolean(mainCallId) &&\n Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId as string));\n const consultMedia = Object.values(interaction?.media ?? {}).find(\n (media: any) =>\n media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult'\n ) as {participants?: string[]} | undefined;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfInConsultCall =\n Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId as string));\n const conferenceActive = isConferencing || conferenceFromBackend || consultFromConference;\n // Treat consult initiator as \"in conference\" even if mainCall participant list lags while consulting.\n const inConference = conferenceActive && (isConferencing || selfInMainCall || consultInitiator);\n\n // Check if this is a consulted agent (must be after isConsulting is computed).\n const isSoleAgentOnCall =\n participantCount <= 1 && selfInMainCall && !isConsulting && !inConference;\n const isConsulted =\n inConference || isSoleAgentOnCall\n ? false\n : getIsConsultedAgentForControls(taskData, context, isConsulting) ||\n (!consultInitiator &&\n (selfParticipant?.isConsulted === true ||\n selfParticipant?.consultState === 'consulting'));\n\n // Active call = can perform call operations\n const isActive =\n state === TaskState.CONNECTED ||\n state === TaskState.HELD ||\n state === TaskState.HOLD_INITIATING ||\n state === TaskState.RESUME_INITIATING ||\n isConsulting ||\n isConferencing;\n\n // Consulted agents have limited controls until they're in conference or wrapup\n // Use inConference (not isConferencing) so controls remain enabled after state downgrade\n const hasFullControls = !isConsulted || consultInitiator || inConference || isWrappingUp;\n const consultOwnedBySelf =\n consultInitiator || (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const ownerParticipant = interaction?.owner\n ? interaction.participants?.[interaction.owner]\n : undefined;\n const otherAgentConsultInProgress = Boolean(\n interaction?.participants &&\n Object.values(interaction.participants).some((participant: any) => {\n if (!participant || participant.hasLeft) return false;\n if (participant.id === selfAgentId) return false;\n if (participant.pType !== 'AGENT') return false;\n\n return (\n participant.consultState === 'consultInitiated' ||\n participant.consultState === 'consultReserved' ||\n participant.consultState === 'consulting' ||\n participant.currentState === 'consulting'\n );\n })\n );\n const isHydratedConferenceConsultPending =\n inConference && selfConsultPendingOnConsultMedia && !consultDestinationAgentJoined;\n const hasParallelConsultLeg =\n consultOwnedBySelf &&\n !isConsulting &&\n !isConsulted &&\n (consultInProgress || consultCallHeld || hasConsultMedia);\n const activeLegForConferenceConsult = consultCallHeld ? 'main' : 'consult';\n const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;\n const isConferenceConsultTransferContext =\n inConference && consultInitiator && hasConsultMedia && isConsultDestinationReady;\n const consultLegOnHold = isConsulting && consultCallHeld;\n const callProcessingDetails = interaction?.callProcessingDetails as\n | {conferenceHoldParticipant?: boolean | string}\n | undefined;\n const conferenceHoldParticipant =\n callProcessingDetails?.conferenceHoldParticipant === true ||\n callProcessingDetails?.conferenceHoldParticipant === 'true';\n const postDeclineHeldMainLeg =\n consultInitiator &&\n !consultDestinationAgentJoined &&\n isHeld &&\n inConference &&\n conferenceHoldParticipant;\n const postConsultCompletedHeldMainLeg =\n selfParticipant?.consultState === 'consultCompleted' && isHeld && inConference && !isConsulting;\n const nonOwnerPostConsultCompletedHeldMainLeg =\n isHeld &&\n inConference &&\n !isConsulting &&\n !consultInitiator &&\n Boolean(selfAgentId) &&\n Boolean(interaction?.owner) &&\n selfAgentId !== interaction?.owner &&\n ownerParticipant?.consultState === 'consultCompleted';\n const isConsultPendingBeforeJoin =\n selfParticipant?.consultState === 'consultInitiated' && !consultDestinationAgentJoined;\n const hideExitConferenceWhileConsultPending =\n currentLeg === 'main' &&\n inConference &&\n isConsultPendingBeforeJoin &&\n (consultFromConference ||\n consultInitiator ||\n taskData?.type === 'AgentConsultCreated' ||\n consultInProgress ||\n isConsulting);\n const hideExitConferenceDuringActiveConsultFromConference =\n inConference &&\n consultInitiator &&\n consultDestinationAgentJoined &&\n (isConsulting ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consulting');\n const hideExitConferenceOnMainLegForEpDnConsultFromConference =\n currentLeg === 'main' &&\n inConference &&\n consultFromConference &&\n consultInitiator &&\n (isConsulting ||\n consultInProgress ||\n taskData?.type === 'AgentConsultCreated' ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consultInitiated' ||\n selfParticipant?.consultState === 'consulting');\n const forceHeldPostConsultControls =\n !hideExitConferenceWhileConsultPending &&\n (postDeclineHeldMainLeg || postConsultCompletedHeldMainLeg);\n const selfOnConsultLeg =\n selfParticipant?.consultState === 'consulting' ||\n selfParticipant?.currentState === 'consulting';\n const showMainLegConferenceControlsDuringConsult =\n currentLeg === 'main' && inConference && consultInProgress && !selfOnConsultLeg;\n const allowHeldMainLegControlsForNonInitiator =\n showMainLegConferenceControlsDuringConsult && !isHydratedConferenceConsultPending;\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_ENABLED;\n if (consultOwnedBySelf && (isConsulting || hasParallelConsultLeg || consultCallHeld)) {\n return DISABLED;\n }\n if (hasParallelConsultLeg) return DISABLED;\n if (state === TaskState.OFFERED) return DISABLED;\n if (isWrappingUp) return DISABLED;\n // Visibility: connected || held || inConference\n if (!(isConnected || isHeld || inConference)) return DISABLED;\n // Enabled: (connected || held) && !inConference && !isConsulting\n const canHold = (isConnected || isHeld) && !inConference && !isConsulting;\n\n return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Mute: WebRTC only, active calls; hidden entirely during wrapup\n mute: (() => {\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (currentLeg === 'consult' && !selfInConsultCall) return DISABLED;\n if ((isConsulting || hasParallelConsultLeg) && !isCurrentLegActive) return VISIBLE_DISABLED;\n if (isConsulting) return VISIBLE_ENABLED;\n\n if (isConnected || isHeld || isConferencing) {\n if (inConference) return VISIBLE_ENABLED;\n\n return isHeld ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // End: varies by state; during consulting only on main leg (consult held)\n end: (() => {\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (!config.isEndTaskEnabled) return DISABLED;\n if (hasParallelConsultLeg) {\n return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (isConsulting) {\n if (currentLeg === 'consult' && consultCallHeld) return DISABLED;\n\n return consultInitiator && consultCallHeld ? VISIBLE_ENABLED : DISABLED;\n }\n\n if (inConference) {\n if (isConsulted) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n\n if (consultInProgress) return VISIBLE_DISABLED;\n\n return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (isActive) return isHeld || isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Transfer: connected/held/conference\n transfer: (() => {\n if (isHydratedConferenceConsultPending) return VISIBLE_DISABLED;\n if (isConferenceConsultTransferContext && currentLeg === 'main' && isCurrentLegActive) {\n return DISABLED;\n }\n if (inConference && isConsulting && consultInitiator) return DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) return VISIBLE_ENABLED;\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n }\n if (isConsulting) {\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): transfer is hidden\n // Pending conference (only self agent): transfer remains available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.CONNECTED || state === TaskState.HELD) return VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Consult: connected/held/conference when conditions met\n consult: (() => {\n const isConnectedOrHeld = state === TaskState.CONNECTED || state === TaskState.HELD;\n\n if (inConference && nonOwnerPostConsultCompletedHeldMainLeg) return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) return DISABLED;\n if (!hasFullControls || !(isConnectedOrHeld || inConference)) {\n return DISABLED;\n }\n\n // In conference: behavior depends on whether it's a real multi-agent conference\n if (inConference) {\n // Pending conference (only self agent): consult disabled\n if (participantCount <= 1) return VISIBLE_DISABLED;\n // Real conference: consult enabled if conditions met\n const canFromConference =\n !maxParticipants &&\n customerPresent &&\n !consultInProgress &&\n !otherAgentConsultInProgress &&\n !isConsulting;\n\n return {isVisible: true, isEnabled: canFromConference};\n }\n\n // Enabled conditions for connected/held\n const canFromConnected =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulted;\n\n return {isVisible: true, isEnabled: canFromConnected};\n })(),\n\n // ConsultTransfer: always hidden (use transfer button)\n consultTransfer: DISABLED,\n\n // EndConsult: during consulting\n endConsult: (() => {\n if (!isConsulting) return DISABLED;\n if (isConsulted && isConferencing) return DISABLED;\n if (!isConsulted && isConferencing && !(consultInitiator && conferenceFromBackend)) {\n return DISABLED;\n }\n\n return {isVisible: true, isEnabled: consultInitiator || config.isEndConsultEnabled};\n })(),\n\n // Recording: connected/held, hidden in real conference, visible in pending conference\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): recording hidden\n // Pending conference (only self agent): recording available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (hasParallelConsultLeg && !customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED || state === TaskState.HELD) {\n return VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // Conference: during consulting, enabled on both legs when agent joined\n // Label changes based on leg: \"Conference\" on main leg, \"Merge\" on consult leg\n conference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) {\n return maxParticipants ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n\n return DISABLED;\n }\n if (!hasFullControls || !isConsulting) return DISABLED;\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Wrapup: wrapping up state\n wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n\n // ExitConference: in conference with multiple agents in main call\n exitConference: (() => {\n if (hideExitConferenceWhileConsultPending) return DISABLED;\n if (hideExitConferenceOnMainLegForEpDnConsultFromConference) return DISABLED;\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (hideExitConferenceDuringActiveConsultFromConference) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n if (isConsulted && !isConferencing) return DISABLED;\n if (!inConference) return DISABLED;\n if (participantCount <= 1) return DISABLED;\n if (consultInProgress) return VISIBLE_DISABLED;\n const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;\n\n return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // TransferConference: in conference with active consult, owner consulting from conference\n transferConference: (() => {\n if (isConferenceConsultTransferContext && !isCurrentLegActive) return VISIBLE_DISABLED;\n const consultLegTransferAvailable =\n currentLeg === 'consult' && inConference && consultInitiator && hasConsultMedia;\n const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';\n const conferenceTransferAvailable =\n consultLegTransferAvailable ||\n (inConference &&\n consultInitiator &&\n hasConsultMedia &&\n (isConsulting || consultInProgress || selfConsultingOnParticipantState));\n if (consultLegOnHold) return DISABLED;\n if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;\n if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;\n if (!consultInitiator || isConsulted) return DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // MergeToConference: mirrors conference control, enabled on both legs\n mergeToConference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!isConsulting || !consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Switch: visible only on the currently active leg\n switch: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!customerPresent && hasParallelConsultLeg) return DISABLED;\n if (currentLeg === 'consult') {\n if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (hasParallelConsultLeg && state === TaskState.CONNECTED) {\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n return DISABLED;\n })(),\n };\n}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const isConsultingState =\n currentState === TaskState.CONSULTING ||\n currentState === TaskState.CONSULT_INITIATING ||\n currentState === TaskState.CONF_INITIATING;\n const consultOwnedBySelf =\n context.consultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const hasConsultMedia = Boolean(\n taskData?.consultMediaResourceId ||\n Object.values(interaction?.media ?? {}).some((media: any) => media?.mType === 'consult')\n );\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const selfConsultingOnConsultMedia =\n selfParticipant?.consultState === 'consulting' && hasConsultMedia;\n const hasConsultLeg = Boolean(\n !interaction?.isTerminated &&\n ((consultOwnedBySelf && !taskData?.isConsulted) ||\n selfConsultingOnConsultMedia ||\n selfConsultPendingOnConsultMedia) &&\n (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia)\n );\n\n if (!hasConsultLeg) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n let mainState = TaskState.HELD;\n if (currentState === TaskState.CONFERENCING) {\n mainState = TaskState.CONFERENCING;\n } else if (context.consultCallHeld) {\n mainState = TaskState.CONNECTED;\n }\n\n return {\n hasConsultLeg: true,\n activeLeg: context.consultCallHeld ? 'main' : 'consult',\n mainState,\n consultState: isConsultingState ? currentState : TaskState.CONSULTING,\n };\n}\n\nexport function computeUIControls(\n currentState: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): TaskUIControls {\n if (currentState === TaskState.TERMINATED || currentState === TaskState.COMPLETED) {\n return getDefaultUIControls();\n }\n\n switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_constants","_TaskUtils","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","getDefaultInteractionUIControls","accept","decline","hold","mute","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","getDefaultUIControls","hasConsultMediaInInteraction","interaction","consultMediaResourceId","media","hasConsultLeg","Object","values","some","entry","mType","Boolean","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","participants","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","selfAgentId","agentId","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultInitiator","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","recordingControlsAvailable","isEpDnConsult","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","isWrappingUp","WRAPPING_UP","selfInMainCall","includes","consultMedia","find","mediaResourceId","selfParticipant","selfInConsultCall","hasConsultMedia","isConsultEndedForSelf","type","consultState","isConsulted","effectiveConsultInitiator","effectiveConsultCallHeld","effectiveConsultFromConference","effectiveConsultDestinationAgentJoined","effectiveHasConsultMedia","isConsultDestinationReady","conferenceActive","inConference","isSoleAgentOnCall","getIsConsultedAgentForControls","isActive","hasFullControls","consultOwnedBySelf","consultingAgentId","selfConsultPendingOnConsultMedia","ownerParticipant","owner","undefined","otherAgentConsultInProgress","participant","id","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","callProcessingDetails","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","isConsultRequestedPhase","isConsultUnansweredFailure","recordingControl","isRecordingEnabled","OFFERED","isTerminated","canHold","isConsultedActiveMainLeg","isEndTaskEnabled","isConnectedOrHeld","canRetryConsult","canFromConference","canFromConnected","isEndConsultEnabled","consultingFromConference","consultLegTransferAvailable","selfConsultingOnParticipantState","conferenceTransferAvailable","computeDigitalInteractionUIControls","getVoiceLegState","mainState","isConsultingState","selfConsultingOnConsultMedia","isHold","resolvedMainId","isMainHeld","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\n/** Consult media must exist on the interaction payload, not only as a stale resource id. */\nfunction hasConsultMediaInInteraction(\n interaction: TaskData['interaction'] | undefined,\n consultMediaResourceId?: string\n): boolean {\n const media = interaction?.media ?? {};\n const hasConsultLeg = Object.values(media).some((entry: any) => entry?.mType === 'consult');\n\n if (hasConsultLeg) return true;\n if (!consultMediaResourceId) return false;\n\n return Boolean(media[consultMediaResourceId]);\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // Prefer live task.data (fallback) over stale state-machine snapshot during multi-login sync.\n const taskData = fallbackTaskData ?? context.taskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const isWebrtc = config.voiceVariant === VOICE_VARIANT.WEBRTC;\n const isOutdial = interaction?.outboundType === 'OUTDIAL';\n const serverHold = getServerHoldStateForControls(context, mainCallId, fallbackTaskData);\n\n // Backend-derived checks\n const customerInCall =\n interaction && mainCallId ? getIsCustomerInCall(interaction, mainCallId) : false;\n // EP-DN/secondary legs can have incomplete media participant lists; fall back to participants map.\n const customerPresent =\n customerInCall ||\n Boolean(\n interaction &&\n interaction.participants &&\n Object.values(interaction.participants).some(\n (p: any) => p?.pType === 'Customer' && !p?.hasLeft\n )\n );\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n const maxParticipants = participantCount >= MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const conferenceFromBackend = taskData ? getIsConferenceInProgress(taskData) : false;\n // Note: ownership is used by some controls; keep computations local to those controls\n\n // Context flags (set by state machine actions)\n const {\n consultInitiator,\n consultDestinationAgentJoined,\n consultDestinationType,\n consultCallHeld,\n consultFromConference,\n } = context;\n const {recordingControlsAvailable} = context;\n\n // EP_DN consults are \"ready\" as soon as the consult is created (EP accepts routing immediately).\n // Backend sends destinationType as 'EP-DN'; SDK method uses 'entryPoint' — check both.\n const isEpDnConsult =\n consultDestinationType === 'entryPoint' || consultDestinationType === ('EP-DN' as any);\n\n const stateImpliesHeld = state === TaskState.HELD || state === TaskState.RESUME_INITIATING;\n const stateImpliesConnected =\n state === TaskState.CONNECTED || state === TaskState.HOLD_INITIATING;\n const isHeld = stateImpliesHeld || serverHold === true;\n const isConnected = stateImpliesConnected || (!stateImpliesHeld && serverHold === false);\n\n // State categories for cleaner logic\n const isConsulting =\n state === TaskState.CONSULTING ||\n state === TaskState.CONSULT_INITIATING ||\n state === TaskState.CONF_INITIATING;\n const isConferencing = state === TaskState.CONFERENCING;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n const selfInMainCall =\n Boolean(selfAgentId) &&\n Boolean(mainCallId) &&\n Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId as string));\n const consultMedia = Object.values(interaction?.media ?? {}).find(\n (media: any) =>\n media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult'\n ) as {participants?: string[]} | undefined;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfInConsultCall =\n Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId as string));\n const hasConsultMedia = hasConsultMediaInInteraction(\n interaction,\n taskData?.consultMediaResourceId\n );\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n taskData?.type === 'AgentConsultFailed' ||\n (selfParticipant?.consultState === 'consultCompleted' &&\n !hasConsultMedia &&\n taskData?.isConsulted === false);\n const effectiveConsultInitiator = isConsultEndedForSelf ? false : consultInitiator;\n const effectiveConsultCallHeld = isConsultEndedForSelf ? false : consultCallHeld;\n const effectiveConsultFromConference = isConsultEndedForSelf ? false : consultFromConference;\n const effectiveConsultDestinationAgentJoined = isConsultEndedForSelf\n ? false\n : consultDestinationAgentJoined;\n // After a consult ends for self, the backend stops sending consult media but the merged\n // task.data can still carry the stale consult-media entry (reconcileData never deletes keys).\n // Treat it as gone so post-consult main-leg controls (consult retry) are not blocked.\n const effectiveHasConsultMedia = isConsultEndedForSelf ? false : hasConsultMedia;\n const isConsultDestinationReady = effectiveConsultDestinationAgentJoined || isEpDnConsult;\n const conferenceActive =\n isConferencing || conferenceFromBackend || effectiveConsultFromConference;\n // Treat consult initiator as \"in conference\" even if mainCall participant list lags while consulting.\n const inConference =\n conferenceActive && (isConferencing || selfInMainCall || effectiveConsultInitiator);\n\n // Check if this is a consulted agent (must be after isConsulting is computed).\n const isSoleAgentOnCall =\n participantCount <= 1 && selfInMainCall && !isConsulting && !inConference;\n const isConsulted =\n inConference || isSoleAgentOnCall\n ? false\n : getIsConsultedAgentForControls(taskData, context, isConsulting) ||\n (!effectiveConsultInitiator &&\n (selfParticipant?.isConsulted === true ||\n selfParticipant?.consultState === 'consulting'));\n\n // Active call = can perform call operations\n const isActive =\n state === TaskState.CONNECTED ||\n state === TaskState.HELD ||\n state === TaskState.HOLD_INITIATING ||\n state === TaskState.RESUME_INITIATING ||\n isConsulting ||\n isConferencing;\n\n // Consulted agents have limited controls until they're in conference or wrapup\n // Use inConference (not isConferencing) so controls remain enabled after state downgrade\n const hasFullControls = !isConsulted || effectiveConsultInitiator || inConference || isWrappingUp;\n const consultOwnedBySelf =\n effectiveConsultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const ownerParticipant = interaction?.owner\n ? interaction.participants?.[interaction.owner]\n : undefined;\n const otherAgentConsultInProgress = Boolean(\n interaction?.participants &&\n Object.values(interaction.participants).some((participant: any) => {\n if (!participant || participant.hasLeft) return false;\n if (participant.id === selfAgentId) return false;\n if (participant.pType !== 'AGENT') return false;\n\n return (\n participant.consultState === 'consultInitiated' ||\n participant.consultState === 'consultReserved' ||\n participant.consultState === 'consulting' ||\n participant.currentState === 'consulting'\n );\n })\n );\n const isHydratedConferenceConsultPending =\n inConference && selfConsultPendingOnConsultMedia && !effectiveConsultDestinationAgentJoined;\n const hasParallelConsultLeg =\n !isConsultEndedForSelf &&\n consultOwnedBySelf &&\n !isConsulting &&\n !isConsulted &&\n (consultInProgress || effectiveConsultCallHeld || hasConsultMedia);\n const activeLegForConferenceConsult = effectiveConsultCallHeld ? 'main' : 'consult';\n const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;\n const isConferenceConsultTransferContext =\n inConference && effectiveConsultInitiator && hasConsultMedia && isConsultDestinationReady;\n const consultLegOnHold = isConsulting && effectiveConsultCallHeld;\n const callProcessingDetails = interaction?.callProcessingDetails as\n | {conferenceHoldParticipant?: boolean | string}\n | undefined;\n const conferenceHoldParticipant =\n callProcessingDetails?.conferenceHoldParticipant === true ||\n callProcessingDetails?.conferenceHoldParticipant === 'true';\n const postDeclineHeldMainLeg =\n consultInitiator &&\n !consultDestinationAgentJoined &&\n isHeld &&\n inConference &&\n conferenceHoldParticipant;\n const postConsultCompletedHeldMainLeg =\n selfParticipant?.consultState === 'consultCompleted' && isHeld && inConference && !isConsulting;\n const nonOwnerPostConsultCompletedHeldMainLeg =\n isHeld &&\n inConference &&\n !isConsulting &&\n !consultInitiator &&\n Boolean(selfAgentId) &&\n Boolean(interaction?.owner) &&\n selfAgentId !== interaction?.owner &&\n ownerParticipant?.consultState === 'consultCompleted';\n const isConsultPendingBeforeJoin =\n selfParticipant?.consultState === 'consultInitiated' && !consultDestinationAgentJoined;\n const hideExitConferenceWhileConsultPending =\n currentLeg === 'main' &&\n inConference &&\n isConsultPendingBeforeJoin &&\n (consultFromConference ||\n consultInitiator ||\n taskData?.type === 'AgentConsultCreated' ||\n consultInProgress ||\n isConsulting);\n const hideExitConferenceDuringActiveConsultFromConference =\n inConference &&\n consultInitiator &&\n consultDestinationAgentJoined &&\n (isConsulting ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consulting');\n const hideExitConferenceOnMainLegForEpDnConsultFromConference =\n currentLeg === 'main' &&\n inConference &&\n consultFromConference &&\n consultInitiator &&\n (isConsulting ||\n consultInProgress ||\n taskData?.type === 'AgentConsultCreated' ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consultInitiated' ||\n selfParticipant?.consultState === 'consulting');\n const forceHeldPostConsultControls =\n !hideExitConferenceWhileConsultPending &&\n (postDeclineHeldMainLeg || postConsultCompletedHeldMainLeg);\n const selfOnConsultLeg =\n selfParticipant?.consultState === 'consulting' ||\n selfParticipant?.currentState === 'consulting';\n const showMainLegConferenceControlsDuringConsult =\n currentLeg === 'main' && inConference && consultInProgress && !selfOnConsultLeg;\n const allowHeldMainLegControlsForNonInitiator =\n showMainLegConferenceControlsDuringConsult && !isHydratedConferenceConsultPending;\n const isConsultRequestedPhase =\n isConsultPendingBeforeJoin &&\n !isConsulted &&\n (consultInitiator ||\n (Boolean(selfAgentId) &&\n selfParticipant?.consultState === 'consultInitiated' &&\n taskData?.agentId === selfAgentId));\n const isConsultUnansweredFailure =\n currentLeg === 'main' &&\n !inConference &&\n !taskData?.isConsulted &&\n !effectiveHasConsultMedia &&\n isHeld &&\n selfParticipant?.consultState === 'consultCompleted' &&\n (taskData?.type === 'AgentConsultFailed' ||\n taskData?.type === 'AgentConsultEnded' ||\n isConsultEndedForSelf);\n\n if (isConsultUnansweredFailure) {\n const recordingControl =\n recordingControlsAvailable && config.isRecordingEnabled && !inConference\n ? VISIBLE_ENABLED\n : DISABLED;\n\n return {\n ...getDefaultInteractionUIControls(),\n hold: VISIBLE_ENABLED,\n transfer: VISIBLE_ENABLED,\n consult: VISIBLE_ENABLED,\n recording: recordingControl,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (isConsultRequestedPhase) {\n if (currentLeg === 'main') {\n return {\n ...getDefaultInteractionUIControls(),\n transfer: VISIBLE_DISABLED,\n conference: VISIBLE_DISABLED,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (currentLeg === 'consult') {\n return {\n ...getDefaultInteractionUIControls(),\n endConsult: VISIBLE_ENABLED,\n switch: VISIBLE_DISABLED,\n transfer: VISIBLE_DISABLED,\n transferConference: inConference ? VISIBLE_DISABLED : DISABLED,\n mergeToConference: VISIBLE_DISABLED,\n };\n }\n }\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_ENABLED;\n if (\n consultOwnedBySelf &&\n (isConsulting || hasParallelConsultLeg || effectiveConsultCallHeld)\n ) {\n return DISABLED;\n }\n if (hasParallelConsultLeg) return DISABLED;\n if (state === TaskState.OFFERED) return DISABLED;\n if (isWrappingUp) return DISABLED;\n // Visibility: connected || held || inConference\n if (!(isConnected || isHeld || inConference)) return DISABLED;\n // Enabled: (connected || held) && !inConference && !isConsulting\n const canHold = (isConnected || isHeld) && !inConference && !isConsulting;\n\n return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Mute: WebRTC only, active calls; hidden entirely during wrapup\n mute: (() => {\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (currentLeg === 'consult' && !selfInConsultCall) return DISABLED;\n // The consulted agent has no separate consult leg; their main leg is the active call, so\n // mute stays available while they consult (the heuristic below targets the initiator's\n // inactive leg, not the consultee's only leg).\n const isConsultedActiveMainLeg = isConsulted && currentLeg === 'main';\n if (\n (isConsulting || hasParallelConsultLeg) &&\n !isCurrentLegActive &&\n !isConsultedActiveMainLeg\n ) {\n return VISIBLE_DISABLED;\n }\n if (isConsulting) return VISIBLE_ENABLED;\n\n if (isConnected || isHeld || isConferencing) {\n if (inConference) return VISIBLE_ENABLED;\n\n return isHeld ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // End: varies by state; during consulting only on main leg (consult held)\n end: (() => {\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (!config.isEndTaskEnabled) return DISABLED;\n if (hasParallelConsultLeg) {\n return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (isConsulting) {\n if (currentLeg === 'consult' && consultCallHeld) return DISABLED;\n\n return consultInitiator && consultCallHeld ? VISIBLE_ENABLED : DISABLED;\n }\n\n if (inConference) {\n if (isConsulted) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n\n if (consultInProgress) return VISIBLE_DISABLED;\n\n return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (isActive) return isHeld || isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Transfer: connected/held/conference\n transfer: (() => {\n if (isHydratedConferenceConsultPending) return VISIBLE_DISABLED;\n if (isConferenceConsultTransferContext && currentLeg === 'main' && isCurrentLegActive) {\n return DISABLED;\n }\n if (inConference && isConsulting && consultInitiator) return DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) return VISIBLE_ENABLED;\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n }\n if (isConsulting) {\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): transfer is hidden\n // Pending conference (only self agent): transfer remains available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.CONNECTED || state === TaskState.HELD) return VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Consult: connected/held/conference when conditions met\n consult: (() => {\n const isConnectedOrHeld = state === TaskState.CONNECTED || state === TaskState.HELD;\n\n if (\n isHeld &&\n !inConference &&\n !effectiveHasConsultMedia &&\n selfParticipant?.consultState === 'consultCompleted' &&\n !taskData?.isConsulted\n ) {\n const canRetryConsult = !maxParticipants && customerPresent && !otherAgentConsultInProgress;\n\n return {isVisible: true, isEnabled: canRetryConsult};\n }\n\n if (inConference && nonOwnerPostConsultCompletedHeldMainLeg) return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) return DISABLED;\n if (!hasFullControls || !(isConnectedOrHeld || inConference)) {\n return DISABLED;\n }\n\n // In conference: behavior depends on whether it's a real multi-agent conference\n if (inConference) {\n // Pending conference (only self agent): consult disabled\n if (participantCount <= 1) return VISIBLE_DISABLED;\n // Real conference: consult enabled if conditions met\n const canFromConference =\n !maxParticipants &&\n customerPresent &&\n !consultInProgress &&\n !otherAgentConsultInProgress &&\n !isConsulting;\n\n return {isVisible: true, isEnabled: canFromConference};\n }\n\n // Enabled conditions for connected/held\n const canFromConnected =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulted;\n\n return {isVisible: true, isEnabled: canFromConnected};\n })(),\n\n // ConsultTransfer: always hidden (use transfer button)\n consultTransfer: DISABLED,\n\n // EndConsult: during consulting\n endConsult: (() => {\n if (!isConsulting) return DISABLED;\n if (isConsulted && isConferencing) return DISABLED;\n if (!isConsulted && isConferencing && !(consultInitiator && conferenceFromBackend)) {\n return DISABLED;\n }\n\n return {isVisible: true, isEnabled: consultInitiator || config.isEndConsultEnabled};\n })(),\n\n // Recording: connected/held, hidden in real conference, visible in pending conference\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): recording hidden\n // Pending conference (only self agent): recording available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (hasParallelConsultLeg && !customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED || state === TaskState.HELD) {\n return VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // Conference: during consulting, enabled on both legs when agent joined\n // Label changes based on leg: \"Conference\" on main leg, \"Merge\" on consult leg\n conference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) {\n return maxParticipants ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n\n return DISABLED;\n }\n if (!hasFullControls || !isConsulting) return DISABLED;\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Wrapup: wrapping up state\n wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n\n // ExitConference: in conference with multiple agents in main call\n exitConference: (() => {\n if (hideExitConferenceWhileConsultPending) return DISABLED;\n if (hideExitConferenceOnMainLegForEpDnConsultFromConference) return DISABLED;\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (hideExitConferenceDuringActiveConsultFromConference) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n if (isConsulted && !isConferencing) return DISABLED;\n if (!inConference) return DISABLED;\n if (participantCount <= 1) return DISABLED;\n if (consultInProgress) return VISIBLE_DISABLED;\n const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;\n\n return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // TransferConference: in conference with active consult, owner consulting from conference\n transferConference: (() => {\n if (isConferenceConsultTransferContext && !isCurrentLegActive) return VISIBLE_DISABLED;\n const consultLegTransferAvailable =\n currentLeg === 'consult' && inConference && consultInitiator && hasConsultMedia;\n const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';\n const conferenceTransferAvailable =\n consultLegTransferAvailable ||\n (inConference &&\n consultInitiator &&\n hasConsultMedia &&\n (isConsulting || consultInProgress || selfConsultingOnParticipantState));\n if (consultLegOnHold) return DISABLED;\n if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;\n if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;\n if (!consultInitiator || isConsulted) return DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // MergeToConference: mirrors conference control, enabled on both legs\n mergeToConference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!isConsulting || !consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Switch: visible only on the currently active leg\n switch: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!customerPresent && hasParallelConsultLeg) return DISABLED;\n if (currentLeg === 'consult') {\n if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (hasParallelConsultLeg && state === TaskState.CONNECTED) {\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n return DISABLED;\n })(),\n };\n}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = fallbackTaskData ?? context.taskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const hasConsultMedia = hasConsultMediaInInteraction(\n interaction,\n taskData?.consultMediaResourceId\n );\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n taskData?.type === 'AgentConsultFailed' ||\n (selfParticipant?.consultState === 'consultCompleted' &&\n !hasConsultMedia &&\n taskData?.isConsulted === false);\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const isConsultingState =\n currentState === TaskState.CONSULTING ||\n currentState === TaskState.CONSULT_INITIATING ||\n currentState === TaskState.CONF_INITIATING;\n const consultOwnedBySelf =\n context.consultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const selfConsultingOnConsultMedia =\n selfParticipant?.consultState === 'consulting' && hasConsultMedia;\n const isConsultUnansweredFailure =\n !taskData?.isConsulted &&\n !hasConsultMedia &&\n selfParticipant?.consultState === 'consultCompleted' &&\n Boolean(mainCallId && taskData?.interaction?.media?.[mainCallId]?.isHold === true) &&\n taskData?.interaction?.state !== 'conference' &&\n !getIsConferenceInProgress(taskData);\n const hasConsultLeg = Boolean(\n !isConsultEndedForSelf &&\n !interaction?.isTerminated &&\n !isConsultUnansweredFailure &&\n (consultOwnedBySelf || selfConsultingOnConsultMedia || selfConsultPendingOnConsultMedia) &&\n (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia)\n );\n\n if (!hasConsultLeg) {\n let mainState = currentState;\n if (isConsultEndedForSelf && taskData?.interaction) {\n const resolvedMainId = taskData.interaction.mainInteractionId || taskData.interactionId;\n const isMainHeld = Boolean(\n resolvedMainId && taskData.interaction.media?.[resolvedMainId]?.isHold === true\n );\n\n if (taskData.interaction.state === 'conference' || getIsConferenceInProgress(taskData)) {\n mainState = TaskState.CONFERENCING;\n } else if (isMainHeld || taskData.interaction.state === 'hold') {\n mainState = TaskState.HELD;\n } else {\n mainState = TaskState.CONNECTED;\n }\n }\n\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n let mainState = TaskState.HELD;\n if (currentState === TaskState.CONFERENCING) {\n mainState = TaskState.CONFERENCING;\n } else if (context.consultCallHeld) {\n mainState = TaskState.CONNECTED;\n }\n\n return {\n hasConsultLeg: true,\n activeLeg: context.consultCallHeld ? 'main' : 'consult',\n mainState,\n consultState: isConsultingState ? currentState : TaskState.CONSULTING,\n };\n}\n\nexport function computeUIControls(\n currentState: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): TaskUIControls {\n if (currentState === TaskState.TERMINATED || currentState === TaskState.COMPLETED) {\n return getDefaultUIControls();\n }\n\n switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -106,6 +106,16 @@ export default abstract class Task extends EventEmitter implements ITask {
106
106
  * ```
107
107
  */
108
108
  updateTaskData(updatedData: TaskData, shouldOverwrite?: boolean): ITask;
109
+ /**
110
+ * The backend sends `interaction.media` and `interaction.participants` as complete snapshots
111
+ * of the current call state. `reconcileData` deep-merges and never removes keys, so entries the
112
+ * backend dropped (e.g. a consult leg's media and consultee participant after the consult ends)
113
+ * linger in `this.data`. That stale data drives incorrect UI controls (e.g. the consult button
114
+ * staying disabled after the consult leg is gone, until a page refresh re-hydrates cleanly).
115
+ * Make only these two snapshot maps authoritative to the incoming payload, leaving every other
116
+ * field on the generic deep-merge path (CAD and other partial updates still merge as before).
117
+ */
118
+ private pruneStaleInteractionMaps;
109
119
  /**
110
120
  * This is used to blind transfer or vTeam transfer the task
111
121
  * @param transferPayload
@@ -33,6 +33,12 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
33
33
  HYDRATE: {
34
34
  actions: string[];
35
35
  };
36
+ CONSULT_CREATED: {
37
+ actions: string[];
38
+ };
39
+ CONSULT_FAILED: {
40
+ actions: string[];
41
+ };
36
42
  };
37
43
  states: {
38
44
  IDLE: {
@@ -157,6 +163,20 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
157
163
  TRANSFER_FAILED: {
158
164
  actions: string[];
159
165
  };
166
+ CONSULT_END: ({
167
+ guard: ({ context, event }: {
168
+ context: any;
169
+ event: any;
170
+ }) => boolean;
171
+ target: TaskState;
172
+ actions: string[];
173
+ } | {
174
+ guard: ({ context }: {
175
+ context: any;
176
+ }) => boolean;
177
+ actions: string[];
178
+ target?: undefined;
179
+ })[];
160
180
  CONTACT_ENDED: ({
161
181
  guard: ({ event }: import("./guards").GuardParams) => boolean;
162
182
  target: TaskState;
@@ -213,6 +233,10 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
213
233
  target: TaskState;
214
234
  actions: string[];
215
235
  };
236
+ CONSULTING_ACTIVE: {
237
+ target: TaskState;
238
+ actions: string[];
239
+ };
216
240
  TRANSFER_SUCCESS: ({
217
241
  guard: ({ context, event }: import("./guards").GuardParams) => boolean;
218
242
  target: TaskState;
@@ -234,6 +258,9 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
234
258
  actions: string[];
235
259
  guard?: undefined;
236
260
  })[];
261
+ CONSULT_END: {
262
+ actions: string[];
263
+ };
237
264
  TASK_WRAPUP: {
238
265
  target: TaskState;
239
266
  actions: string[];
@@ -264,6 +291,10 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
264
291
  target: TaskState;
265
292
  actions: string[];
266
293
  };
294
+ CONSULTING_ACTIVE: {
295
+ target: TaskState;
296
+ actions: string[];
297
+ };
267
298
  CONSULT_FAILED: ({
268
299
  guard: ({ context }: {
269
300
  context: any;
@@ -284,6 +315,15 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
284
315
  actions: string[];
285
316
  guard?: undefined;
286
317
  })[];
318
+ CONSULT_END: ({
319
+ guard: ({ event }: import("./guards").GuardParams) => boolean;
320
+ target: TaskState;
321
+ actions: string[];
322
+ } | {
323
+ target: TaskState;
324
+ actions: string[];
325
+ guard?: undefined;
326
+ })[];
287
327
  };
288
328
  };
289
329
  CONSULTING: {
@@ -291,6 +331,17 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
291
331
  CONSULTING_ACTIVE: {
292
332
  actions: string[];
293
333
  };
334
+ CONSULT_FAILED: ({
335
+ guard: ({ context }: {
336
+ context: any;
337
+ }) => boolean;
338
+ target: TaskState;
339
+ actions: string[];
340
+ } | {
341
+ target: TaskState;
342
+ actions: string[];
343
+ guard?: undefined;
344
+ })[];
294
345
  CONSULT_END: ({
295
346
  guard: ({ context, event }: {
296
347
  context: any;
@@ -440,6 +491,10 @@ export declare function getTaskStateMachineConfig(uiControlConfig: UIControlConf
440
491
  target: TaskState;
441
492
  actions: string[];
442
493
  };
494
+ CONSULTING_ACTIVE: {
495
+ target: TaskState;
496
+ actions: string[];
497
+ };
443
498
  PARTICIPANT_LEAVE: ({
444
499
  guard: (params: any) => boolean;
445
500
  target: TaskState;
@@ -535,6 +590,12 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
535
590
  HYDRATE: {
536
591
  actions: string[];
537
592
  };
593
+ CONSULT_CREATED: {
594
+ actions: string[];
595
+ };
596
+ CONSULT_FAILED: {
597
+ actions: string[];
598
+ };
538
599
  };
539
600
  states: {
540
601
  IDLE: {
@@ -659,6 +720,20 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
659
720
  TRANSFER_FAILED: {
660
721
  actions: string[];
661
722
  };
723
+ CONSULT_END: ({
724
+ guard: ({ context, event }: {
725
+ context: any;
726
+ event: any;
727
+ }) => boolean;
728
+ target: TaskState;
729
+ actions: string[];
730
+ } | {
731
+ guard: ({ context }: {
732
+ context: any;
733
+ }) => boolean;
734
+ actions: string[];
735
+ target?: undefined;
736
+ })[];
662
737
  CONTACT_ENDED: ({
663
738
  guard: ({ event }: import("./guards").GuardParams) => boolean;
664
739
  target: TaskState;
@@ -715,6 +790,10 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
715
790
  target: TaskState;
716
791
  actions: string[];
717
792
  };
793
+ CONSULTING_ACTIVE: {
794
+ target: TaskState;
795
+ actions: string[];
796
+ };
718
797
  TRANSFER_SUCCESS: ({
719
798
  guard: ({ context, event }: import("./guards").GuardParams) => boolean;
720
799
  target: TaskState;
@@ -736,6 +815,9 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
736
815
  actions: string[];
737
816
  guard?: undefined;
738
817
  })[];
818
+ CONSULT_END: {
819
+ actions: string[];
820
+ };
739
821
  TASK_WRAPUP: {
740
822
  target: TaskState;
741
823
  actions: string[];
@@ -766,6 +848,10 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
766
848
  target: TaskState;
767
849
  actions: string[];
768
850
  };
851
+ CONSULTING_ACTIVE: {
852
+ target: TaskState;
853
+ actions: string[];
854
+ };
769
855
  CONSULT_FAILED: ({
770
856
  guard: ({ context }: {
771
857
  context: any;
@@ -786,6 +872,15 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
786
872
  actions: string[];
787
873
  guard?: undefined;
788
874
  })[];
875
+ CONSULT_END: ({
876
+ guard: ({ event }: import("./guards").GuardParams) => boolean;
877
+ target: TaskState;
878
+ actions: string[];
879
+ } | {
880
+ target: TaskState;
881
+ actions: string[];
882
+ guard?: undefined;
883
+ })[];
789
884
  };
790
885
  };
791
886
  CONSULTING: {
@@ -793,6 +888,17 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
793
888
  CONSULTING_ACTIVE: {
794
889
  actions: string[];
795
890
  };
891
+ CONSULT_FAILED: ({
892
+ guard: ({ context }: {
893
+ context: any;
894
+ }) => boolean;
895
+ target: TaskState;
896
+ actions: string[];
897
+ } | {
898
+ target: TaskState;
899
+ actions: string[];
900
+ guard?: undefined;
901
+ })[];
796
902
  CONSULT_END: ({
797
903
  guard: ({ context, event }: {
798
904
  context: any;
@@ -942,6 +1048,10 @@ export declare function createTaskStateMachine(uiControlConfig: UIControlConfig,
942
1048
  target: TaskState;
943
1049
  actions: string[];
944
1050
  };
1051
+ CONSULTING_ACTIVE: {
1052
+ target: TaskState;
1053
+ actions: string[];
1054
+ };
945
1055
  PARTICIPANT_LEAVE: ({
946
1056
  guard: (params: any) => boolean;
947
1057
  target: TaskState;
@@ -3,6 +3,8 @@
3
3
  */
4
4
  import { TaskContext, TaskEventPayload, UIControlConfig, TaskActionsMap } from './types';
5
5
  import { TaskState } from './constants';
6
+ import { TaskData } from '../types';
7
+ export declare const getTaskStateForUiControls: (taskData: TaskData | undefined, selfAgentId: string | undefined) => TaskState;
6
8
  export declare function createInitialContext(uiControlConfig: UIControlConfig, initialState?: TaskState): TaskContext;
7
9
  export declare function updateUIControls(currentState: TaskState): import("xstate").ActionFunction<TaskContext, TaskEventPayload, TaskEventPayload, {}, import("xstate").ProvidedActor, never, never, never, never>;
8
10
  export declare const actions: TaskActionsMap;
package/dist/webex.js CHANGED
@@ -41,7 +41,7 @@ if (!global.Buffer) {
41
41
  */
42
42
  const Webex = _webexCore.default.extend({
43
43
  webex: true,
44
- version: `3.12.0-task-refactor.7`
44
+ version: `3.12.0-task-refactor.8`
45
45
  });
46
46
 
47
47
  /**
package/package.json CHANGED
@@ -83,5 +83,5 @@
83
83
  "typedoc": "^0.25.0",
84
84
  "typescript": "5.4.5"
85
85
  },
86
- "version": "3.12.0-task-refactor.7"
86
+ "version": "3.12.0-task-refactor.8"
87
87
  }
@@ -589,12 +589,46 @@ export default abstract class Task extends EventEmitter implements ITask {
589
589
  */
590
590
  public updateTaskData(updatedData: TaskData, shouldOverwrite = false): ITask {
591
591
  this.data = shouldOverwrite ? updatedData : this.reconcileData(this.data, updatedData);
592
+ if (!shouldOverwrite) {
593
+ this.pruneStaleInteractionMaps(updatedData);
594
+ }
592
595
  this.updateUiControls();
593
596
  this.setupAutoWrapupTimer();
594
597
 
595
598
  return this;
596
599
  }
597
600
 
601
+ /**
602
+ * The backend sends `interaction.media` and `interaction.participants` as complete snapshots
603
+ * of the current call state. `reconcileData` deep-merges and never removes keys, so entries the
604
+ * backend dropped (e.g. a consult leg's media and consultee participant after the consult ends)
605
+ * linger in `this.data`. That stale data drives incorrect UI controls (e.g. the consult button
606
+ * staying disabled after the consult leg is gone, until a page refresh re-hydrates cleanly).
607
+ * Make only these two snapshot maps authoritative to the incoming payload, leaving every other
608
+ * field on the generic deep-merge path (CAD and other partial updates still merge as before).
609
+ */
610
+ private pruneStaleInteractionMaps(incoming: TaskData): void {
611
+ const incomingInteraction = incoming?.interaction;
612
+ const currentInteraction = this.data?.interaction;
613
+ if (!incomingInteraction || !currentInteraction) {
614
+ return;
615
+ }
616
+
617
+ (['media', 'participants'] as const).forEach((mapKey) => {
618
+ const incomingMap = incomingInteraction[mapKey] as Record<string, unknown> | undefined;
619
+ const currentMap = currentInteraction[mapKey] as Record<string, unknown> | undefined;
620
+ if (!incomingMap || !currentMap || typeof incomingMap !== 'object') {
621
+ return;
622
+ }
623
+
624
+ Object.keys(currentMap).forEach((id) => {
625
+ if (!(id in incomingMap)) {
626
+ delete currentMap[id];
627
+ }
628
+ });
629
+ });
630
+ }
631
+
598
632
  /**
599
633
  * This is used to blind transfer or vTeam transfer the task
600
634
  * @param transferPayload
@@ -89,10 +89,12 @@ export const getIsConsultInProgressForConferenceControls = (
89
89
  if (!p || p.hasLeft) return false;
90
90
  if (selfAgentId && participantId === selfAgentId) return false;
91
91
 
92
+ const consultState = p.consultState as string | undefined;
93
+ const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;
92
94
  const consultLegActive =
93
- p.consultState === 'consulting' ||
94
- p.isConsulted === true ||
95
- p.currentState === 'consulting';
95
+ consultState === 'consulting' ||
96
+ p.currentState === 'consulting' ||
97
+ (p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee);
96
98
 
97
99
  return consultLegActive && !mainSet.has(participantId);
98
100
  });