@webex/contact-center 3.12.0-task-refactor.7 → 3.12.0-task-refactor.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cc.js +3 -4
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/metrics/constants.js +2 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +74 -3
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/config/types.js +9 -1
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/task/Task.js +32 -0
- package/dist/services/task/Task.js.map +1 -1
- package/dist/services/task/TaskManager.js +7 -2
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +3 -1
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/state-machine/TaskStateMachine.js +76 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
- package/dist/services/task/state-machine/actions.js +113 -23
- package/dist/services/task/state-machine/actions.js.map +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js +99 -21
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/metrics/constants.d.ts +2 -0
- package/dist/types/services/ApiAiAssistant.d.ts +10 -2
- package/dist/types/services/config/types.d.ts +16 -0
- package/dist/types/services/task/Task.d.ts +10 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +110 -0
- package/dist/types/services/task/state-machine/actions.d.ts +2 -0
- package/dist/types/types.d.ts +24 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +1 -1
- package/package.json +1 -1
- package/src/cc.ts +6 -4
- package/src/constants.ts +1 -0
- package/src/metrics/constants.ts +2 -0
- package/src/services/ApiAiAssistant.ts +102 -2
- package/src/services/config/types.ts +8 -0
- package/src/services/task/Task.ts +34 -0
- package/src/services/task/TaskManager.ts +7 -2
- package/src/services/task/TaskUtils.ts +5 -3
- package/src/services/task/ai-docs/AGENTS.md +7 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +12 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +104 -0
- package/src/services/task/state-machine/actions.ts +151 -25
- package/src/services/task/state-machine/uiControlsComputer.ts +173 -30
- package/src/types.ts +25 -0
- package/test/unit/spec/cc.ts +2 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +105 -17
- package/test/unit/spec/services/task/Task.ts +61 -0
- package/test/unit/spec/services/task/TaskManager.ts +42 -0
- package/test/unit/spec/services/task/TaskUtils.ts +65 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +676 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +597 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +99 -106
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_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":";;;;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AASA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAdA;AACA;AACA;;AAqBA,MAAMG,QAAQ,GAAG;EAACC,SAAS,EAAE,KAAK;EAAEC,SAAS,EAAE;AAAK,CAAU;AAC9D,MAAMC,eAAe,GAAG;EAACF,SAAS,EAAE,IAAI;EAAEC,SAAS,EAAE;AAAI,CAAU;AACnE,MAAME,gBAAgB,GAAG;EAACH,SAAS,EAAE,IAAI;EAAEC,SAAS,EAAE;AAAK,CAAU;AAErE,SAASG,+BAA+BA,CAAA,EAA0B;EAChE,OAAO;IACLC,MAAM,EAAEN,QAAQ;IAChBO,OAAO,EAAEP,QAAQ;IACjBQ,IAAI,EAAER,QAAQ;IACdS,IAAI,EAAET,QAAQ;IACdU,GAAG,EAAEV,QAAQ;IACbW,QAAQ,EAAEX,QAAQ;IAClBY,OAAO,EAAEZ,QAAQ;IACjBa,eAAe,EAAEb,QAAQ;IACzBc,UAAU,EAAEd,QAAQ;IACpBe,SAAS,EAAEf,QAAQ;IACnBgB,UAAU,EAAEhB,QAAQ;IACpBiB,MAAM,EAAEjB,QAAQ;IAChBkB,cAAc,EAAElB,QAAQ;IACxBmB,kBAAkB,EAAEnB,QAAQ;IAC5BoB,iBAAiB,EAAEpB,QAAQ;IAC3BqB,MAAM,EAAErB;EACV,CAAC;AACH;AAEA,SAASsB,oBAAoBA,CAC3BC,IAA2B,EAC3BX,OAA8B,EAC9BY,SAAoB,EACJ;EAChB,OAAO;IACLD,IAAI;IACJX,OAAO;IACPY;EACF,CAAC;AACH;AAEO,SAASC,oBAAoBA,CAAA,EAAmB;EACrD,OAAOH,oBAAoB,CACzBjB,+BAA+B,CAAC,CAAC,EACjCA,+BAA+B,CAAC,CAAC,EACjC,MACF,CAAC;AACH;;AAEA;AACA,SAASqB,4BAA4BA,CACnCC,WAAgD,EAChDC,sBAA+B,EACtB;EACT,MAAMC,KAAK,GAAGF,WAAW,EAAEE,KAAK,IAAI,CAAC,CAAC;EACtC,MAAMC,aAAa,GAAGC,MAAM,CAACC,MAAM,CAACH,KAAK,CAAC,CAACI,IAAI,CAAEC,KAAU,IAAKA,KAAK,EAAEC,KAAK,KAAK,SAAS,CAAC;EAE3F,IAAIL,aAAa,EAAE,OAAO,IAAI;EAC9B,IAAI,CAACF,sBAAsB,EAAE,OAAO,KAAK;EAEzC,OAAOQ,OAAO,CAACP,KAAK,CAACD,sBAAsB,CAAC,CAAC;AAC/C;AAEA,SAASS,iCAAiCA,CACxCC,KAAgB,EAChBC,OAAoB,EACpBC,MAAuB,EACvBC,gBAA2B,EAC3BC,UAAqB,GAAG,MAAM,EACP;EACvB;EACA,IAAIJ,KAAK,KAAKK,oBAAS,CAACC,IAAI,EAAE;IAC5B,OAAOvC,+BAA+B,CAAC,CAAC;EAC1C;;EAEA;EACA,MAAMwC,QAAQ,GAAGJ,gBAAgB,IAAIF,OAAO,CAACM,QAAQ,IAAI,IAAI;EAC7D,MAAMlB,WAAW,GAAGkB,QAAQ,EAAElB,WAAW;EACzC,MAAMmB,UAAU,GAAGnB,WAAW,EAAEoB,iBAAiB,IAAIF,QAAQ,EAAEG,aAAa;EAC5E,MAAMC,QAAQ,GAAGT,MAAM,CAACU,YAAY,KAAKC,oBAAa,CAACC,MAAM;EAC7D,MAAMC,SAAS,GAAG1B,WAAW,EAAE2B,YAAY,KAAK,SAAS;EACzD,MAAMC,UAAU,GAAG,IAAAC,wCAA6B,EAACjB,OAAO,EAAEO,UAAU,EAAEL,gBAAgB,CAAC;;EAEvF;EACA,MAAMgB,cAAc,GAClB9B,WAAW,IAAImB,UAAU,GAAG,IAAAY,8BAAmB,EAAC/B,WAAW,EAAEmB,UAAU,CAAC,GAAG,KAAK;EAClF;EACA,MAAMa,eAAe,GACnBF,cAAc,IACdrB,OAAO,CACLT,WAAW,IACTA,WAAW,CAACiC,YAAY,IACxB7B,MAAM,CAACC,MAAM,CAACL,WAAW,CAACiC,YAAY,CAAC,CAAC3B,IAAI,CACzC4B,CAAM,IAAKA,CAAC,EAAEC,KAAK,KAAK,UAAU,IAAI,CAACD,CAAC,EAAEE,OAC7C,CACJ,CAAC;EACH,MAAMC,gBAAgB,GACpBrC,WAAW,IAAImB,UAAU,GAAG,IAAAmB,yCAA8B,EAACtC,WAAW,EAAEmB,UAAU,CAAC,GAAG,CAAC;EACzF,MAAMoB,eAAe,GAAGF,gBAAgB,IAAIG,oDAAyC;EACrF,MAAMC,WAAW,GAAG5B,MAAM,CAAC6B,OAAO,IAAIxB,QAAQ,EAAEwB,OAAO;EACvD,MAAMC,iBAAiB,GAAG,IAAAC,sDAA2C,EACnE5C,WAAW,EACXmB,UAAU,EACVsB,WACF,CAAC;EACD,MAAMI,qBAAqB,GAAG3B,QAAQ,GAAG,IAAA4B,oCAAyB,EAAC5B,QAAQ,CAAC,GAAG,KAAK;EACpF;;EAEA;EACA,MAAM;IACJ6B,gBAAgB;IAChBC,6BAA6B;IAC7BC,sBAAsB;IACtBC,eAAe;IACfC;EACF,CAAC,GAAGvC,OAAO;EACX,MAAM;IAACwC;EAA0B,CAAC,GAAGxC,OAAO;;EAE5C;EACA;EACA,MAAMyC,aAAa,GACjBJ,sBAAsB,KAAK,YAAY,IAAIA,sBAAsB,KAAM,OAAe;EAExF,MAAMK,gBAAgB,GAAG3C,KAAK,KAAKK,oBAAS,CAACuC,IAAI,IAAI5C,KAAK,KAAKK,oBAAS,CAACwC,iBAAiB;EAC1F,MAAMC,qBAAqB,GACzB9C,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,IAAI/C,KAAK,KAAKK,oBAAS,CAAC2C,eAAe;EACtE,MAAMC,MAAM,GAAGN,gBAAgB,IAAI1B,UAAU,KAAK,IAAI;EACtD,MAAMiC,WAAW,GAAGJ,qBAAqB,IAAK,CAACH,gBAAgB,IAAI1B,UAAU,KAAK,KAAM;;EAExF;EACA,MAAMkC,YAAY,GAChBnD,KAAK,KAAKK,oBAAS,CAAC+C,UAAU,IAC9BpD,KAAK,KAAKK,oBAAS,CAACgD,kBAAkB,IACtCrD,KAAK,KAAKK,oBAAS,CAACiD,eAAe;EACrC,MAAMC,cAAc,GAAGvD,KAAK,KAAKK,oBAAS,CAACmD,YAAY;EACvD,MAAMC,YAAY,GAAGzD,KAAK,KAAKK,oBAAS,CAACqD,WAAW;EACpD,MAAMC,cAAc,GAClB7D,OAAO,CAACgC,WAAW,CAAC,IACpBhC,OAAO,CAACU,UAAU,CAAC,IACnBV,OAAO,CAACT,WAAW,EAAEE,KAAK,GAAGiB,UAAU,CAAC,EAAEc,YAAY,EAAEsC,QAAQ,CAAC9B,WAAqB,CAAC,CAAC;EAC1F,MAAM+B,YAAY,GAAGpE,MAAM,CAACC,MAAM,CAACL,WAAW,EAAEE,KAAK,IAAI,CAAC,CAAC,CAAC,CAACuE,IAAI,CAC9DvE,KAAU,IACTA,KAAK,EAAEwE,eAAe,KAAKxD,QAAQ,EAAEjB,sBAAsB,IAAIC,KAAK,EAAEM,KAAK,KAAK,SACpF,CAA0C;EAC1C,MAAMmE,eAAe,GAAGlC,WAAW,GAAGzC,WAAW,EAAEiC,YAAY,GAAGQ,WAAW,CAAC,GAAG,IAAI;EACrF,MAAMmC,iBAAiB,GACrBnE,OAAO,CAACgC,WAAW,CAAC,IAAIhC,OAAO,CAAC+D,YAAY,EAAEvC,YAAY,EAAEsC,QAAQ,CAAC9B,WAAqB,CAAC,CAAC;EAC9F,MAAMoC,eAAe,GAAG9E,4BAA4B,CAClDC,WAAW,EACXkB,QAAQ,EAAEjB,sBACZ,CAAC;EACD,MAAM6E,qBAAqB,GACzB5D,QAAQ,EAAE6D,IAAI,KAAK,mBAAmB,IACtC7D,QAAQ,EAAE6D,IAAI,KAAK,oBAAoB,IACtCJ,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACnD,CAACH,eAAe,IAChB3D,QAAQ,EAAE+D,WAAW,KAAK,KAAM;EACpC,MAAMC,yBAAyB,GAAGJ,qBAAqB,GAAG,KAAK,GAAG/B,gBAAgB;EAClF,MAAMoC,wBAAwB,GAAGL,qBAAqB,GAAG,KAAK,GAAG5B,eAAe;EAChF,MAAMkC,8BAA8B,GAAGN,qBAAqB,GAAG,KAAK,GAAG3B,qBAAqB;EAC5F,MAAMkC,sCAAsC,GAAGP,qBAAqB,GAChE,KAAK,GACL9B,6BAA6B;EACjC;EACA;EACA;EACA,MAAMsC,wBAAwB,GAAGR,qBAAqB,GAAG,KAAK,GAAGD,eAAe;EAChF,MAAMU,yBAAyB,GAAGF,sCAAsC,IAAIhC,aAAa;EACzF,MAAMmC,gBAAgB,GACpBtB,cAAc,IAAIrB,qBAAqB,IAAIuC,8BAA8B;EAC3E;EACA,MAAMK,YAAY,GAChBD,gBAAgB,KAAKtB,cAAc,IAAII,cAAc,IAAIY,yBAAyB,CAAC;;EAErF;EACA,MAAMQ,iBAAiB,GACrBrD,gBAAgB,IAAI,CAAC,IAAIiC,cAAc,IAAI,CAACR,YAAY,IAAI,CAAC2B,YAAY;EAC3E,MAAMR,WAAW,GACfQ,YAAY,IAAIC,iBAAiB,GAC7B,KAAK,GACL,IAAAC,yCAA8B,EAACzE,QAAQ,EAAEN,OAAO,EAAEkD,YAAY,CAAC,IAC9D,CAACoB,yBAAyB,KACxBP,eAAe,EAAEM,WAAW,KAAK,IAAI,IACpCN,eAAe,EAAEK,YAAY,KAAK,YAAY,CAAE;;EAE1D;EACA,MAAMY,QAAQ,GACZjF,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,IAC7B/C,KAAK,KAAKK,oBAAS,CAACuC,IAAI,IACxB5C,KAAK,KAAKK,oBAAS,CAAC2C,eAAe,IACnChD,KAAK,KAAKK,oBAAS,CAACwC,iBAAiB,IACrCM,YAAY,IACZI,cAAc;;EAEhB;EACA;EACA,MAAM2B,eAAe,GAAG,CAACZ,WAAW,IAAIC,yBAAyB,IAAIO,YAAY,IAAIrB,YAAY;EACjG,MAAM0B,kBAAkB,GACtBZ,yBAAyB,IACxBzE,OAAO,CAACgC,WAAW,CAAC,IAAIvB,QAAQ,EAAE6E,iBAAiB,KAAKtD,WAAY;EACvE,MAAMuD,gCAAgC,GACpCrB,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpD,CAAC9D,QAAQ,EAAE+D,WAAW,IACtBJ,eAAe;EACjB,MAAMoB,gBAAgB,GAAGjG,WAAW,EAAEkG,KAAK,GACvClG,WAAW,CAACiC,YAAY,GAAGjC,WAAW,CAACkG,KAAK,CAAC,GAC7CC,SAAS;EACb,MAAMC,2BAA2B,GAAG3F,OAAO,CACzCT,WAAW,EAAEiC,YAAY,IACvB7B,MAAM,CAACC,MAAM,CAACL,WAAW,CAACiC,YAAY,CAAC,CAAC3B,IAAI,CAAE+F,WAAgB,IAAK;IACjE,IAAI,CAACA,WAAW,IAAIA,WAAW,CAACjE,OAAO,EAAE,OAAO,KAAK;IACrD,IAAIiE,WAAW,CAACC,EAAE,KAAK7D,WAAW,EAAE,OAAO,KAAK;IAChD,IAAI4D,WAAW,CAAClE,KAAK,KAAK,OAAO,EAAE,OAAO,KAAK;IAE/C,OACEkE,WAAW,CAACrB,YAAY,KAAK,kBAAkB,IAC/CqB,WAAW,CAACrB,YAAY,KAAK,iBAAiB,IAC9CqB,WAAW,CAACrB,YAAY,KAAK,YAAY,IACzCqB,WAAW,CAACE,YAAY,KAAK,YAAY;EAE7C,CAAC,CACL,CAAC;EACD,MAAMC,kCAAkC,GACtCf,YAAY,IAAIO,gCAAgC,IAAI,CAACX,sCAAsC;EAC7F,MAAMoB,qBAAqB,GACzB,CAAC3B,qBAAqB,IACtBgB,kBAAkB,IAClB,CAAChC,YAAY,IACb,CAACmB,WAAW,KACXtC,iBAAiB,IAAIwC,wBAAwB,IAAIN,eAAe,CAAC;EACpE,MAAM6B,6BAA6B,GAAGvB,wBAAwB,GAAG,MAAM,GAAG,SAAS;EACnF,MAAMwB,kBAAkB,GAAG5F,UAAU,KAAK2F,6BAA6B;EACvE,MAAME,kCAAkC,GACtCnB,YAAY,IAAIP,yBAAyB,IAAIL,eAAe,IAAIU,yBAAyB;EAC3F,MAAMsB,gBAAgB,GAAG/C,YAAY,IAAIqB,wBAAwB;EACjE,MAAM2B,qBAAqB,GAAG9G,WAAW,EAAE8G,qBAE9B;EACb,MAAMC,yBAAyB,GAC7BD,qBAAqB,EAAEC,yBAAyB,KAAK,IAAI,IACzDD,qBAAqB,EAAEC,yBAAyB,KAAK,MAAM;EAC7D,MAAMC,sBAAsB,GAC1BjE,gBAAgB,IAChB,CAACC,6BAA6B,IAC9BY,MAAM,IACN6B,YAAY,IACZsB,yBAAyB;EAC3B,MAAME,+BAA+B,GACnCtC,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IAAIpB,MAAM,IAAI6B,YAAY,IAAI,CAAC3B,YAAY;EACjG,MAAMoD,uCAAuC,GAC3CtD,MAAM,IACN6B,YAAY,IACZ,CAAC3B,YAAY,IACb,CAACf,gBAAgB,IACjBtC,OAAO,CAACgC,WAAW,CAAC,IACpBhC,OAAO,CAACT,WAAW,EAAEkG,KAAK,CAAC,IAC3BzD,WAAW,KAAKzC,WAAW,EAAEkG,KAAK,IAClCD,gBAAgB,EAAEjB,YAAY,KAAK,kBAAkB;EACvD,MAAMmC,0BAA0B,GAC9BxC,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IAAI,CAAChC,6BAA6B;EACxF,MAAMoE,qCAAqC,GACzCrG,UAAU,KAAK,MAAM,IACrB0E,YAAY,IACZ0B,0BAA0B,KACzBhE,qBAAqB,IACpBJ,gBAAgB,IAChB7B,QAAQ,EAAE6D,IAAI,KAAK,qBAAqB,IACxCpC,iBAAiB,IACjBmB,YAAY,CAAC;EACjB,MAAMuD,mDAAmD,GACvD5B,YAAY,IACZ1C,gBAAgB,IAChBC,6BAA6B,KAC5Bc,YAAY,IACX5C,QAAQ,EAAE6D,IAAI,KAAK,iBAAiB,IACpCJ,eAAe,EAAEK,YAAY,KAAK,YAAY,CAAC;EACnD,MAAMsC,uDAAuD,GAC3DvG,UAAU,KAAK,MAAM,IACrB0E,YAAY,IACZtC,qBAAqB,IACrBJ,gBAAgB,KACfe,YAAY,IACXnB,iBAAiB,IACjBzB,QAAQ,EAAE6D,IAAI,KAAK,qBAAqB,IACxC7D,QAAQ,EAAE6D,IAAI,KAAK,iBAAiB,IACpCJ,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpDL,eAAe,EAAEK,YAAY,KAAK,YAAY,CAAC;EACnD,MAAMuC,4BAA4B,GAChC,CAACH,qCAAqC,KACrCJ,sBAAsB,IAAIC,+BAA+B,CAAC;EAC7D,MAAMO,gBAAgB,GACpB7C,eAAe,EAAEK,YAAY,KAAK,YAAY,IAC9CL,eAAe,EAAE4B,YAAY,KAAK,YAAY;EAChD,MAAMkB,0CAA0C,GAC9C1G,UAAU,KAAK,MAAM,IAAI0E,YAAY,IAAI9C,iBAAiB,IAAI,CAAC6E,gBAAgB;EACjF,MAAME,uCAAuC,GAC3CD,0CAA0C,IAAI,CAACjB,kCAAkC;EACnF,MAAMmB,uBAAuB,GAC3BR,0BAA0B,IAC1B,CAAClC,WAAW,KACXlC,gBAAgB,IACdtC,OAAO,CAACgC,WAAW,CAAC,IACnBkC,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpD9D,QAAQ,EAAEwB,OAAO,KAAKD,WAAY,CAAC;EACzC,MAAMmF,0BAA0B,GAC9B7G,UAAU,KAAK,MAAM,IACrB,CAAC0E,YAAY,IACb,CAACvE,QAAQ,EAAE+D,WAAW,IACtB,CAACK,wBAAwB,IACzB1B,MAAM,IACNe,eAAe,EAAEK,YAAY,KAAK,kBAAkB,KACnD9D,QAAQ,EAAE6D,IAAI,KAAK,oBAAoB,IACtC7D,QAAQ,EAAE6D,IAAI,KAAK,mBAAmB,IACtCD,qBAAqB,CAAC;EAE1B,IAAI8C,0BAA0B,EAAE;IAC9B,MAAMC,gBAAgB,GACpBzE,0BAA0B,IAAIvC,MAAM,CAACiH,kBAAkB,IAAI,CAACrC,YAAY,GACpEjH,eAAe,GACfH,QAAQ;IAEd,OAAO;MACL,GAAGK,+BAA+B,CAAC,CAAC;MACpCG,IAAI,EAAEL,eAAe;MACrBQ,QAAQ,EAAER,eAAe;MACzBS,OAAO,EAAET,eAAe;MACxBY,SAAS,EAAEyI,gBAAgB;MAC3B9I,GAAG,EAAEN;IACP,CAAC;EACH;EAEA,IAAIkJ,uBAAuB,EAAE;IAC3B,IAAI5G,UAAU,KAAK,MAAM,EAAE;MACzB,OAAO;QACL,GAAGrC,+BAA+B,CAAC,CAAC;QACpCM,QAAQ,EAAEP,gBAAgB;QAC1BY,UAAU,EAAEZ,gBAAgB;QAC5BM,GAAG,EAAEN;MACP,CAAC;IACH;IAEA,IAAIsC,UAAU,KAAK,SAAS,EAAE;MAC5B,OAAO;QACL,GAAGrC,+BAA+B,CAAC,CAAC;QACpCS,UAAU,EAAEX,eAAe;QAC3BkB,MAAM,EAAEjB,gBAAgB;QACxBO,QAAQ,EAAEP,gBAAgB;QAC1Be,kBAAkB,EAAEiG,YAAY,GAAGhH,gBAAgB,GAAGJ,QAAQ;QAC9DoB,iBAAiB,EAAEhB;MACrB,CAAC;IACH;EACF;EAEA,OAAO;IACL;IACA;IACA;IACA;IACAE,MAAM,EACJgC,KAAK,KAAKK,oBAAS,CAAC+G,OAAO,IAAI,CAAC/H,WAAW,EAAEgI,YAAY,GACrD;MAAC1J,SAAS,EAAE,IAAI;MAAEC,SAAS,EAAE+C,QAAQ,IAAI,CAACI;IAAS,CAAC,GACpDrD,QAAQ;IACdO,OAAO,EAAE,CAAC,MAAM;MACd,IAAI,CAAC0C,QAAQ,IAAIX,KAAK,KAAKK,oBAAS,CAAC+G,OAAO,IAAI/H,WAAW,EAAEgI,YAAY,EAAE,OAAO3J,QAAQ;MAE1F,OAAOqD,SAAS,GAAGjD,gBAAgB,GAAGD,eAAe;IACvD,CAAC,EAAE,CAAC;IAEJ;IACAK,IAAI,EAAE,CAAC,MAAM;MACX,IAAI,CAACgH,eAAe,EAAE,OAAOxH,QAAQ;MACrC,IAAIkJ,4BAA4B,EAAE,OAAO/I,eAAe;MACxD,IACEsH,kBAAkB,KACjBhC,YAAY,IAAI2C,qBAAqB,IAAItB,wBAAwB,CAAC,EACnE;QACA,OAAO9G,QAAQ;MACjB;MACA,IAAIoI,qBAAqB,EAAE,OAAOpI,QAAQ;MAC1C,IAAIsC,KAAK,KAAKK,oBAAS,CAAC+G,OAAO,EAAE,OAAO1J,QAAQ;MAChD,IAAI+F,YAAY,EAAE,OAAO/F,QAAQ;MACjC;MACA,IAAI,EAAEwF,WAAW,IAAID,MAAM,IAAI6B,YAAY,CAAC,EAAE,OAAOpH,QAAQ;MAC7D;MACA,MAAM4J,OAAO,GAAG,CAACpE,WAAW,IAAID,MAAM,KAAK,CAAC6B,YAAY,IAAI,CAAC3B,YAAY;MAEzE,OAAOmE,OAAO,GAAGzJ,eAAe,GAAGC,gBAAgB;IACrD,CAAC,EAAE,CAAC;IAEJ;IACAK,IAAI,EAAE,CAAC,MAAM;MACX,IAAI,CAACwC,QAAQ,EAAE,OAAOjD,QAAQ;MAC9B,IAAI+F,YAAY,EAAE,OAAO/F,QAAQ;MACjC,IAAI0C,UAAU,KAAK,SAAS,IAAI,CAAC6D,iBAAiB,EAAE,OAAOvG,QAAQ;MACnE;MACA;MACA;MACA,MAAM6J,wBAAwB,GAAGjD,WAAW,IAAIlE,UAAU,KAAK,MAAM;MACrE,IACE,CAAC+C,YAAY,IAAI2C,qBAAqB,KACtC,CAACE,kBAAkB,IACnB,CAACuB,wBAAwB,EACzB;QACA,OAAOzJ,gBAAgB;MACzB;MACA,IAAIqF,YAAY,EAAE,OAAOtF,eAAe;MAExC,IAAIqF,WAAW,IAAID,MAAM,IAAIM,cAAc,EAAE;QAC3C,IAAIuB,YAAY,EAAE,OAAOjH,eAAe;QAExC,OAAOoF,MAAM,GAAGnF,gBAAgB,GAAGD,eAAe;MACpD;MAEA,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAU,GAAG,EAAE,CAAC,MAAM;MACV,IAAI2I,uCAAuC,EAAE,OAAOlJ,eAAe;MACnE,IAAIiJ,0CAA0C,EAAE,OAAOhJ,gBAAgB;MACvE,IAAI+H,kCAAkC,IAAIzF,UAAU,KAAK,MAAM,EAAE,OAAOtC,gBAAgB;MACxF,IAAI,CAACoC,MAAM,CAACsH,gBAAgB,EAAE,OAAO9J,QAAQ;MAC7C,IAAIoI,qBAAqB,EAAE;QACzB,OAAO5C,WAAW,IAAIR,aAAa,GAAG7E,eAAe,GAAGC,gBAAgB;MAC1E;MAEA,IAAIqF,YAAY,EAAE;QAChB,IAAI/C,UAAU,KAAK,SAAS,IAAImC,eAAe,EAAE,OAAO7E,QAAQ;QAEhE,OAAO0E,gBAAgB,IAAIG,eAAe,GAAG1E,eAAe,GAAGH,QAAQ;MACzE;MAEA,IAAIoH,YAAY,EAAE;QAChB,IAAIR,WAAW,EAAE,OAAO5G,QAAQ;QAChC,IAAIkJ,4BAA4B,EAAE,OAAO9I,gBAAgB;QAEzD,IAAIkE,iBAAiB,EAAE,OAAOlE,gBAAgB;QAE9C,OAAO2F,YAAY,GAAG3F,gBAAgB,GAAGD,eAAe;MAC1D;MACA,IAAI,CAACqH,eAAe,EAAE,OAAOxH,QAAQ;MACrC,IAAIuH,QAAQ,EAAE,OAAOhC,MAAM,IAAIQ,YAAY,GAAG3F,gBAAgB,GAAGD,eAAe;MAEhF,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAW,QAAQ,EAAE,CAAC,MAAM;MACf,IAAIwH,kCAAkC,EAAE,OAAO/H,gBAAgB;MAC/D,IAAImI,kCAAkC,IAAI7F,UAAU,KAAK,MAAM,IAAI4F,kBAAkB,EAAE;QACrF,OAAOtI,QAAQ;MACjB;MACA,IAAIoH,YAAY,IAAI3B,YAAY,IAAIf,gBAAgB,EAAE,OAAO1E,QAAQ;MACrE,IAAIoI,qBAAqB,EAAE;QACzB,IAAI,CAACzE,eAAe,EAAE,OAAO3D,QAAQ;QACrC,IAAIsC,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,EAAE,OAAOlF,eAAe;QACzD,IAAImC,KAAK,KAAKK,oBAAS,CAACuC,IAAI,EAAE,OAAO9E,gBAAgB;MACvD;MACA,IAAIqF,YAAY,EAAE;QAChB,IAAI,CAACf,gBAAgB,EAAE,OAAO1E,QAAQ;QACtC,IAAI,CAAC2D,eAAe,EAAE,OAAOvD,gBAAgB;QAC7C,IAAIoI,gBAAgB,EAAE,OAAOpI,gBAAgB;QAE7C,OAAO8G,yBAAyB,GAAG/G,eAAe,GAAGC,gBAAgB;MACvE;MACA,IAAI,CAACoH,eAAe,EAAE,OAAOxH,QAAQ;MACrC,IAAIoH,YAAY,EAAE;QAChB;QACA;QACA,OAAOpD,gBAAgB,GAAG,CAAC,GAAGhE,QAAQ,GAAGG,eAAe;MAC1D;MACA,IAAImC,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,IAAI/C,KAAK,KAAKK,oBAAS,CAACuC,IAAI,EAAE,OAAO/E,eAAe;MAErF,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAY,OAAO,EAAE,CAAC,MAAM;MACd,MAAMmJ,iBAAiB,GAAGzH,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,IAAI/C,KAAK,KAAKK,oBAAS,CAACuC,IAAI;MAEnF,IACEK,MAAM,IACN,CAAC6B,YAAY,IACb,CAACH,wBAAwB,IACzBX,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpD,CAAC9D,QAAQ,EAAE+D,WAAW,EACtB;QACA,MAAMoD,eAAe,GAAG,CAAC9F,eAAe,IAAIP,eAAe,IAAI,CAACoE,2BAA2B;QAE3F,OAAO;UAAC9H,SAAS,EAAE,IAAI;UAAEC,SAAS,EAAE8J;QAAe,CAAC;MACtD;MAEA,IAAI5C,YAAY,IAAIyB,uCAAuC,EAAE,OAAOzI,gBAAgB;MACpF,IAAIgI,qBAAqB,EAAE,OAAOpI,QAAQ;MAC1C,IAAI,CAACwH,eAAe,IAAI,EAAEuC,iBAAiB,IAAI3C,YAAY,CAAC,EAAE;QAC5D,OAAOpH,QAAQ;MACjB;;MAEA;MACA,IAAIoH,YAAY,EAAE;QAChB;QACA,IAAIpD,gBAAgB,IAAI,CAAC,EAAE,OAAO5D,gBAAgB;QAClD;QACA,MAAM6J,iBAAiB,GACrB,CAAC/F,eAAe,IAChBP,eAAe,IACf,CAACW,iBAAiB,IAClB,CAACyD,2BAA2B,IAC5B,CAACtC,YAAY;QAEf,OAAO;UAACxF,SAAS,EAAE,IAAI;UAAEC,SAAS,EAAE+J;QAAiB,CAAC;MACxD;;MAEA;MACA,MAAMC,gBAAgB,GACpB,CAAChG,eAAe,IAAIP,eAAe,IAAI,CAACW,iBAAiB,IAAI,CAACsC,WAAW;MAE3E,OAAO;QAAC3G,SAAS,EAAE,IAAI;QAAEC,SAAS,EAAEgK;MAAgB,CAAC;IACvD,CAAC,EAAE,CAAC;IAEJ;IACArJ,eAAe,EAAEb,QAAQ;IAEzB;IACAc,UAAU,EAAE,CAAC,MAAM;MACjB,IAAI,CAAC2E,YAAY,EAAE,OAAOzF,QAAQ;MAClC,IAAI4G,WAAW,IAAIf,cAAc,EAAE,OAAO7F,QAAQ;MAClD,IAAI,CAAC4G,WAAW,IAAIf,cAAc,IAAI,EAAEnB,gBAAgB,IAAIF,qBAAqB,CAAC,EAAE;QAClF,OAAOxE,QAAQ;MACjB;MAEA,OAAO;QAACC,SAAS,EAAE,IAAI;QAAEC,SAAS,EAAEwE,gBAAgB,IAAIlC,MAAM,CAAC2H;MAAmB,CAAC;IACrF,CAAC,EAAE,CAAC;IAEJ;IACApJ,SAAS,EAAE,CAAC,MAAM;MAChB,IAAI,CAACgE,0BAA0B,IAAI,CAACvC,MAAM,CAACiH,kBAAkB,EAAE,OAAOzJ,QAAQ;MAC9E,IAAI,CAACwH,eAAe,IAAI/B,YAAY,EAAE,OAAOzF,QAAQ;MACrD,IAAIoH,YAAY,EAAE;QAChB;QACA;QACA,OAAOpD,gBAAgB,GAAG,CAAC,GAAGhE,QAAQ,GAAGG,eAAe;MAC1D;MACA,IAAIiI,qBAAqB,IAAI,CAACzE,eAAe,EAAE,OAAO3D,QAAQ;MAC9D,IAAIsC,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,IAAI/C,KAAK,KAAKK,oBAAS,CAACuC,IAAI,EAAE;QAC7D,OAAO/E,eAAe;MACxB;MAEA,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACA;IACAgB,UAAU,EAAE,CAAC,MAAM;MACjB,IAAImH,kCAAkC,IAAIzF,UAAU,KAAK,MAAM,EAAE,OAAOtC,gBAAgB;MACxF,IAAIgI,qBAAqB,EAAE;QACzB,IAAI,CAACzE,eAAe,EAAE,OAAO3D,QAAQ;QACrC,IAAIsC,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,EAAE;UACjC,OAAOnB,eAAe,GAAG9D,gBAAgB,GAAGD,eAAe;QAC7D;QACA,IAAImC,KAAK,KAAKK,oBAAS,CAACuC,IAAI,EAAE,OAAO9E,gBAAgB;QAErD,OAAOJ,QAAQ;MACjB;MACA,IAAI,CAACwH,eAAe,IAAI,CAAC/B,YAAY,EAAE,OAAOzF,QAAQ;MACtD,IAAI,CAAC0E,gBAAgB,EAAE,OAAO1E,QAAQ;MACtC,IAAI,CAAC2D,eAAe,EAAE,OAAOvD,gBAAgB;MAC7C,IAAIoI,gBAAgB,EAAE,OAAOpI,gBAAgB;MAE7C,OAAO8G,yBAAyB,IAAI,CAAChD,eAAe,GAAG/D,eAAe,GAAGC,gBAAgB;IAC3F,CAAC,EAAE,CAAC;IAEJ;IACAa,MAAM,EAAE8E,YAAY,GAAG5F,eAAe,GAAGH,QAAQ;IAEjD;IACAkB,cAAc,EAAE,CAAC,MAAM;MACrB,IAAI6H,qCAAqC,EAAE,OAAO/I,QAAQ;MAC1D,IAAIiJ,uDAAuD,EAAE,OAAOjJ,QAAQ;MAC5E,IAAIqJ,uCAAuC,EAAE,OAAOlJ,eAAe;MACnE,IAAIiJ,0CAA0C,EAAE,OAAOhJ,gBAAgB;MACvE,IAAI4I,mDAAmD,EAAE,OAAOhJ,QAAQ;MACxE,IAAIkJ,4BAA4B,EAAE,OAAO9I,gBAAgB;MACzD,IAAIwG,WAAW,IAAI,CAACf,cAAc,EAAE,OAAO7F,QAAQ;MACnD,IAAI,CAACoH,YAAY,EAAE,OAAOpH,QAAQ;MAClC,IAAIgE,gBAAgB,IAAI,CAAC,EAAE,OAAOhE,QAAQ;MAC1C,IAAIsE,iBAAiB,EAAE,OAAOlE,gBAAgB;MAC9C,MAAMgK,wBAAwB,GAAG1F,gBAAgB,IAAIe,YAAY,IAAIjB,qBAAqB;MAE1F,OAAO4F,wBAAwB,GAAGhK,gBAAgB,GAAGD,eAAe;IACtE,CAAC,EAAE,CAAC;IAEJ;IACAgB,kBAAkB,EAAE,CAAC,MAAM;MACzB,IAAIoH,kCAAkC,IAAI,CAACD,kBAAkB,EAAE,OAAOlI,gBAAgB;MACtF,MAAMiK,2BAA2B,GAC/B3H,UAAU,KAAK,SAAS,IAAI0E,YAAY,IAAI1C,gBAAgB,IAAI8B,eAAe;MACjF,MAAM8D,gCAAgC,GAAGhE,eAAe,EAAEK,YAAY,KAAK,YAAY;MACvF,MAAM4D,2BAA2B,GAC/BF,2BAA2B,IAC1BjD,YAAY,IACX1C,gBAAgB,IAChB8B,eAAe,KACdf,YAAY,IAAInB,iBAAiB,IAAIgG,gCAAgC,CAAE;MAC5E,IAAI9B,gBAAgB,EAAE,OAAOxI,QAAQ;MACrC,IAAIoI,qBAAqB,IAAI,CAACmC,2BAA2B,EAAE,OAAOvK,QAAQ;MAC1E,IAAI,CAACuK,2BAA2B,KAAK,CAACnD,YAAY,IAAI,CAAC3B,YAAY,CAAC,EAAE,OAAOzF,QAAQ;MACrF,IAAI,CAAC0E,gBAAgB,IAAIkC,WAAW,EAAE,OAAO5G,QAAQ;MAErD,OAAOkH,yBAAyB,GAAG/G,eAAe,GAAGC,gBAAgB;IACvE,CAAC,EAAE,CAAC;IAEJ;IACAgB,iBAAiB,EAAE,CAAC,MAAM;MACxB,IAAI+G,kCAAkC,IAAIzF,UAAU,KAAK,SAAS,EAAE,OAAOtC,gBAAgB;MAC3F,IAAI,CAACqF,YAAY,IAAI,CAACf,gBAAgB,EAAE,OAAO1E,QAAQ;MACvD,IAAI,CAAC2D,eAAe,EAAE,OAAOvD,gBAAgB;MAC7C,IAAIoI,gBAAgB,EAAE,OAAOpI,gBAAgB;MAE7C,OAAO8G,yBAAyB,IAAI,CAAChD,eAAe,GAAG/D,eAAe,GAAGC,gBAAgB;IAC3F,CAAC,EAAE,CAAC;IAEJ;IACAiB,MAAM,EAAE,CAAC,MAAM;MACb,IAAI8G,kCAAkC,IAAIzF,UAAU,KAAK,SAAS,EAAE,OAAOtC,gBAAgB;MAC3F,IAAI,CAACuD,eAAe,IAAIyE,qBAAqB,EAAE,OAAOpI,QAAQ;MAC9D,IAAI0C,UAAU,KAAK,SAAS,EAAE;QAC5B,IAAI,CAAC+C,YAAY,IAAI,CAACf,gBAAgB,IAAIG,eAAe,EAAE,OAAO7E,QAAQ;QAC1E,IAAI,CAAC2D,eAAe,EAAE,OAAOvD,gBAAgB;QAE7C,OAAO8G,yBAAyB,GAAG/G,eAAe,GAAGC,gBAAgB;MACvE;MAEA,IAAIgI,qBAAqB,IAAI9F,KAAK,KAAKK,oBAAS,CAAC0C,SAAS,EAAE;QAC1D,OAAO6B,yBAAyB,GAAG/G,eAAe,GAAGC,gBAAgB;MACvE;MAEA,OAAOJ,QAAQ;IACjB,CAAC,EAAE;EACL,CAAC;AACH;AAEA,SAASwK,mCAAmCA,CAC1ClI,KAAgB,EAChBC,OAAoB,EACpBE,gBAA2B,EACJ;EACvB,MAAMI,QAAQ,GAAGN,OAAO,CAACM,QAAQ,IAAIJ,gBAAgB,IAAI,IAAI;EAC7D,MAAMkH,YAAY,GAAG9G,QAAQ,EAAElB,WAAW,EAAEgI,YAAY,IAAI,KAAK;EAEjE,MAAMnE,WAAW,GAAGlD,KAAK,KAAKK,oBAAS,CAAC0C,SAAS;EACjD,MAAMU,YAAY,GAAGzD,KAAK,KAAKK,oBAAS,CAACqD,WAAW;EAEpD,OAAO;IACL1F,MAAM,EAAEgC,KAAK,KAAKK,oBAAS,CAAC+G,OAAO,GAAGvJ,eAAe,GAAGH,QAAQ;IAChEO,OAAO,EAAEP,QAAQ;IACjBQ,IAAI,EAAER,QAAQ;IACdS,IAAI,EAAET,QAAQ;IACdU,GAAG,EAAE8E,WAAW,IAAI,CAACO,YAAY,GAAG5F,eAAe,GAAGH,QAAQ;IAC9DW,QAAQ,EAAE6E,WAAW,IAAI,CAACO,YAAY,GAAG5F,eAAe,GAAGH,QAAQ;IACnEY,OAAO,EAAEZ,QAAQ;IACjBa,eAAe,EAAEb,QAAQ;IACzBc,UAAU,EAAEd,QAAQ;IACpBe,SAAS,EAAEf,QAAQ;IACnBgB,UAAU,EAAEhB,QAAQ;IACpBiB,MAAM,EAAE0I,YAAY,IAAI5D,YAAY,GAAG5F,eAAe,GAAGH,QAAQ;IACjEkB,cAAc,EAAElB,QAAQ;IACxBmB,kBAAkB,EAAEnB,QAAQ;IAC5BoB,iBAAiB,EAAEpB,QAAQ;IAC3BqB,MAAM,EAAErB;EACV,CAAC;AACH;AAEA,SAASyK,gBAAgBA,CACvBvC,YAAuB,EACvB3F,OAAoB,EACpBC,MAAuB,EACvBC,gBAA2B,EACoE;EAC/F,IAAIyF,YAAY,KAAKvF,oBAAS,CAACqD,WAAW,EAAE;IAC1C,OAAO;MACLlE,aAAa,EAAE,KAAK;MACpBN,SAAS,EAAE,MAAM;MACjBkJ,SAAS,EAAExC,YAAY;MACvBvB,YAAY,EAAEhE,oBAAS,CAAC+C;IAC1B,CAAC;EACH;EAEA,MAAM7C,QAAQ,GAAGJ,gBAAgB,IAAIF,OAAO,CAACM,QAAQ,IAAI,IAAI;EAC7D,MAAMlB,WAAW,GAAGkB,QAAQ,EAAElB,WAAW;EACzC,MAAMmB,UAAU,GAAGnB,WAAW,EAAEoB,iBAAiB,IAAIF,QAAQ,EAAEG,aAAa;EAC5E,MAAMoB,WAAW,GAAG5B,MAAM,CAAC6B,OAAO,IAAIxB,QAAQ,EAAEwB,OAAO;EACvD,MAAMiC,eAAe,GAAGlC,WAAW,GAAGzC,WAAW,EAAEiC,YAAY,GAAGQ,WAAW,CAAC,GAAG,IAAI;EACrF,MAAMoC,eAAe,GAAG9E,4BAA4B,CAClDC,WAAW,EACXkB,QAAQ,EAAEjB,sBACZ,CAAC;EACD,MAAM6E,qBAAqB,GACzB5D,QAAQ,EAAE6D,IAAI,KAAK,mBAAmB,IACtC7D,QAAQ,EAAE6D,IAAI,KAAK,oBAAoB,IACtCJ,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACnD,CAACH,eAAe,IAChB3D,QAAQ,EAAE+D,WAAW,KAAK,KAAM;EACpC,MAAMtC,iBAAiB,GAAG,IAAAC,sDAA2C,EACnE5C,WAAW,EACXmB,UAAU,EACVsB,WACF,CAAC;EACD,MAAMuG,iBAAiB,GACrBzC,YAAY,KAAKvF,oBAAS,CAAC+C,UAAU,IACrCwC,YAAY,KAAKvF,oBAAS,CAACgD,kBAAkB,IAC7CuC,YAAY,KAAKvF,oBAAS,CAACiD,eAAe;EAC5C,MAAM6B,kBAAkB,GACtBlF,OAAO,CAACmC,gBAAgB,IACvBtC,OAAO,CAACgC,WAAW,CAAC,IAAIvB,QAAQ,EAAE6E,iBAAiB,KAAKtD,WAAY;EACvE,MAAMuD,gCAAgC,GACpCrB,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpD,CAAC9D,QAAQ,EAAE+D,WAAW,IACtBJ,eAAe;EACjB,MAAMoE,4BAA4B,GAChCtE,eAAe,EAAEK,YAAY,KAAK,YAAY,IAAIH,eAAe;EACnE,MAAM+C,0BAA0B,GAC9B,CAAC1G,QAAQ,EAAE+D,WAAW,IACtB,CAACJ,eAAe,IAChBF,eAAe,EAAEK,YAAY,KAAK,kBAAkB,IACpDvE,OAAO,CAACU,UAAU,IAAID,QAAQ,EAAElB,WAAW,EAAEE,KAAK,GAAGiB,UAAU,CAAC,EAAE+H,MAAM,KAAK,IAAI,CAAC,IAClFhI,QAAQ,EAAElB,WAAW,EAAEW,KAAK,KAAK,YAAY,IAC7C,CAAC,IAAAmC,oCAAyB,EAAC5B,QAAQ,CAAC;EACtC,MAAMf,aAAa,GAAGM,OAAO,CAC3B,CAACqE,qBAAqB,IACpB,CAAC9E,WAAW,EAAEgI,YAAY,IAC1B,CAACJ,0BAA0B,KAC1B9B,kBAAkB,IAAImD,4BAA4B,IAAIjD,gCAAgC,CAAC,KACvFrD,iBAAiB,IAAIqG,iBAAiB,IAAIpI,OAAO,CAACsC,eAAe,IAAI2B,eAAe,CACzF,CAAC;EAED,IAAI,CAAC1E,aAAa,EAAE;IAClB,IAAI4I,SAAS,GAAGxC,YAAY;IAC5B,IAAIzB,qBAAqB,IAAI5D,QAAQ,EAAElB,WAAW,EAAE;MAClD,MAAMmJ,cAAc,GAAGjI,QAAQ,CAAClB,WAAW,CAACoB,iBAAiB,IAAIF,QAAQ,CAACG,aAAa;MACvF,MAAM+H,UAAU,GAAG3I,OAAO,CACxB0I,cAAc,IAAIjI,QAAQ,CAAClB,WAAW,CAACE,KAAK,GAAGiJ,cAAc,CAAC,EAAED,MAAM,KAAK,IAC7E,CAAC;MAED,IAAIhI,QAAQ,CAAClB,WAAW,CAACW,KAAK,KAAK,YAAY,IAAI,IAAAmC,oCAAyB,EAAC5B,QAAQ,CAAC,EAAE;QACtF6H,SAAS,GAAG/H,oBAAS,CAACmD,YAAY;MACpC,CAAC,MAAM,IAAIiF,UAAU,IAAIlI,QAAQ,CAAClB,WAAW,CAACW,KAAK,KAAK,MAAM,EAAE;QAC9DoI,SAAS,GAAG/H,oBAAS,CAACuC,IAAI;MAC5B,CAAC,MAAM;QACLwF,SAAS,GAAG/H,oBAAS,CAAC0C,SAAS;MACjC;IACF;IAEA,OAAO;MACLvD,aAAa,EAAE,KAAK;MACpBN,SAAS,EAAE,MAAM;MACjBkJ,SAAS;MACT/D,YAAY,EAAEhE,oBAAS,CAAC+C;IAC1B,CAAC;EACH;EAEA,IAAIgF,SAAS,GAAG/H,oBAAS,CAACuC,IAAI;EAC9B,IAAIgD,YAAY,KAAKvF,oBAAS,CAACmD,YAAY,EAAE;IAC3C4E,SAAS,GAAG/H,oBAAS,CAACmD,YAAY;EACpC,CAAC,MAAM,IAAIvD,OAAO,CAACsC,eAAe,EAAE;IAClC6F,SAAS,GAAG/H,oBAAS,CAAC0C,SAAS;EACjC;EAEA,OAAO;IACLvD,aAAa,EAAE,IAAI;IACnBN,SAAS,EAAEe,OAAO,CAACsC,eAAe,GAAG,MAAM,GAAG,SAAS;IACvD6F,SAAS;IACT/D,YAAY,EAAEgE,iBAAiB,GAAGzC,YAAY,GAAGvF,oBAAS,CAAC+C;EAC7D,CAAC;AACH;AAEO,SAASsF,iBAAiBA,CAC/B9C,YAAuB,EACvB3F,OAAoB,EACpBE,gBAA2B,EACX;EAChB,IAAIyF,YAAY,KAAKvF,oBAAS,CAACsI,UAAU,IAAI/C,YAAY,KAAKvF,oBAAS,CAACuI,SAAS,EAAE;IACjF,OAAOzJ,oBAAoB,CAAC,CAAC;EAC/B;EAEA,QAAQc,OAAO,CAAC4I,eAAe,CAACC,WAAW;IACzC,KAAKC,wBAAiB,CAACC,KAAK;MAAE;QAC5B,MAAM;UAACxJ,aAAa;UAAEN,SAAS;UAAEkJ,SAAS;UAAE/D;QAAY,CAAC,GAAG8D,gBAAgB,CAC1EvC,YAAY,EACZ3F,OAAO,EACPA,OAAO,CAAC4I,eAAe,EACvB1I,gBACF,CAAC;QAED,MAAM8I,YAAY,GAAGlJ,iCAAiC,CACpDqI,SAAS,EACTnI,OAAO,EACPA,OAAO,CAAC4I,eAAe,EACvB1I,gBAAgB,EAChB,MACF,CAAC;QACD,MAAM+I,eAAe,GAAG1J,aAAa,GACjCO,iCAAiC,CAC/BsE,YAAY,EACZpE,OAAO,EACPA,OAAO,CAAC4I,eAAe,EACvB1I,gBAAgB,EAChB,SACF,CAAC,GACDpC,+BAA+B,CAAC,CAAC;QAErC,OAAOiB,oBAAoB,CAACiK,YAAY,EAAEC,eAAe,EAAEhK,SAAS,CAAC;MACvE;IACA,KAAK6J,wBAAiB,CAACI,OAAO;MAC5B,OAAOnK,oBAAoB,CACzBkJ,mCAAmC,CAACtC,YAAY,EAAE3F,OAAO,EAAEE,gBAAgB,CAAC,EAC5EpC,+BAA+B,CAAC,CAAC,EACjC,MACF,CAAC;IACH;MACE,OAAOoB,oBAAoB,CAAC,CAAC;EACjC;AACF;AAEA,SAASiK,gCAAgCA,CACvCC,QAA+B,EAC/BC,IAA2B,EAClB;EACT,OAAQ7J,MAAM,CAAC8J,IAAI,CAACD,IAAI,CAAC,CAAqC3J,IAAI,CAAE6J,GAAG,IAAK;IAC1E,MAAMC,IAAI,GAAGJ,QAAQ,CAACG,GAAG,CAAC;IAC1B,MAAME,IAAI,GAAGJ,IAAI,CAACE,GAAG,CAAC;IAEtB,OAAOC,IAAI,CAAC9L,SAAS,KAAK+L,IAAI,CAAC/L,SAAS,IAAI8L,IAAI,CAAC7L,SAAS,KAAK8L,IAAI,CAAC9L,SAAS;EAC/E,CAAC,CAAC;AACJ;AAEO,SAAS+L,qBAAqBA,CACnCN,QAAoC,EACpCC,IAAoB,EACX;EACT,IAAI,CAACD,QAAQ,EAAE,OAAO,IAAI;EAE1B,OACEA,QAAQ,CAACnK,SAAS,KAAKoK,IAAI,CAACpK,SAAS,IACrCkK,gCAAgC,CAACC,QAAQ,CAACpK,IAAI,EAAEqK,IAAI,CAACrK,IAAI,CAAC,IAC1DmK,gCAAgC,CAACC,QAAQ,CAAC/K,OAAO,EAAEgL,IAAI,CAAChL,OAAO,CAAC;AAEpE","ignoreList":[]}
|
|
@@ -145,6 +145,8 @@ export declare const METRIC_EVENT_NAMES: {
|
|
|
145
145
|
readonly OUTDIAL_ANI_EP_FETCH_FAILED: "Outdial ANI Entries Fetch Failed";
|
|
146
146
|
readonly AI_ASSISTANT_SEND_EVENT_SUCCESS: "AI Assistant Send Event Success";
|
|
147
147
|
readonly AI_ASSISTANT_SEND_EVENT_FAILED: "AI Assistant Send Event Failed";
|
|
148
|
+
readonly AI_ASSISTANT_GET_SUGGESTED_RESPONSE_SUCCESS: "AI Assistant Get Suggested Response Success";
|
|
149
|
+
readonly AI_ASSISTANT_GET_SUGGESTED_RESPONSE_FAILED: "AI Assistant Get Suggested Response Failed";
|
|
148
150
|
readonly AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS: "AI Assistant Fetch Historic Transcripts Success";
|
|
149
151
|
readonly AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED: "AI Assistant Fetch Historic Transcripts Failed";
|
|
150
152
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WebexSDK, TranscriptAction, AIAssistantEventType, AIAssistantEventName, HistoricTranscriptsResponse } from '../types';
|
|
1
|
+
import { WebexSDK, TranscriptAction, AIAssistantEventType, AIAssistantEventName, HistoricTranscriptsResponse, SuggestedResponseParams } from '../types';
|
|
2
2
|
import { AIFeatureFlags } from './config/types';
|
|
3
3
|
/**
|
|
4
4
|
* ApiAIAssistant provides AI Assistant APIs for transcript controls.
|
|
@@ -19,7 +19,15 @@ export declare class ApiAIAssistant {
|
|
|
19
19
|
* @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
|
|
20
20
|
* @param action - action within eventDetails (e.g. 'START' or 'STOP')
|
|
21
21
|
*/
|
|
22
|
-
sendEvent(agentId: string, interactionId: string, eventType: AIAssistantEventType, eventName: AIAssistantEventName, action
|
|
22
|
+
sendEvent(agentId: string, interactionId: string, eventType: AIAssistantEventType, eventName: AIAssistantEventName, action?: TranscriptAction, context?: string, languageCode?: string, trackingId?: string): Promise<Record<string, unknown>>;
|
|
23
|
+
/**
|
|
24
|
+
* Requests a suggested response for an interaction.
|
|
25
|
+
*
|
|
26
|
+
* @param params - Suggestion request parameters
|
|
27
|
+
* @returns HTTP response body from the AI Assistant event API
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
getSuggestedResponse(params: SuggestedResponseParams): Promise<any>;
|
|
23
31
|
/**
|
|
24
32
|
* Fetches historic transcripts for an interaction.
|
|
25
33
|
* This API is allowed only when real-time transcription feature is enabled.
|
|
@@ -114,6 +114,14 @@ export declare const CC_TASK_EVENTS: {
|
|
|
114
114
|
readonly AGENT_INVITE_FAILED: "AgentInviteFailed";
|
|
115
115
|
/** Event emitted when a real-time transcript chunk is received */
|
|
116
116
|
readonly REAL_TIME_TRANSCRIPTION: "REAL_TIME_TRANSCRIPTION";
|
|
117
|
+
/** Event emitted when an AI assistant suggested response is available */
|
|
118
|
+
readonly SUGGESTED_RESPONSE: "SUGGESTED_RESPONSE";
|
|
119
|
+
/** Event emitted when backend acknowledges it is listening for more context */
|
|
120
|
+
readonly SUGGESTED_RESPONSE_ACKNOWLEDGE: "SUGGESTED_RESPONSE_ACKNOWLEDGE";
|
|
121
|
+
/** Event emitted when a mid-call summary is available */
|
|
122
|
+
readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
|
|
123
|
+
/** Event emitted when a post-call summary is available */
|
|
124
|
+
readonly POST_CALL_SUMMARY: "POST_CALL_SUMMARY";
|
|
117
125
|
};
|
|
118
126
|
/**
|
|
119
127
|
* Events emitted on Contact Center agent operations
|
|
@@ -273,6 +281,14 @@ export declare const CC_EVENTS: {
|
|
|
273
281
|
readonly AGENT_INVITE_FAILED: "AgentInviteFailed";
|
|
274
282
|
/** Event emitted when a real-time transcript chunk is received */
|
|
275
283
|
readonly REAL_TIME_TRANSCRIPTION: "REAL_TIME_TRANSCRIPTION";
|
|
284
|
+
/** Event emitted when an AI assistant suggested response is available */
|
|
285
|
+
readonly SUGGESTED_RESPONSE: "SUGGESTED_RESPONSE";
|
|
286
|
+
/** Event emitted when backend acknowledges it is listening for more context */
|
|
287
|
+
readonly SUGGESTED_RESPONSE_ACKNOWLEDGE: "SUGGESTED_RESPONSE_ACKNOWLEDGE";
|
|
288
|
+
/** Event emitted when a mid-call summary is available */
|
|
289
|
+
readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
|
|
290
|
+
/** Event emitted when a post-call summary is available */
|
|
291
|
+
readonly POST_CALL_SUMMARY: "POST_CALL_SUMMARY";
|
|
276
292
|
/** Welcome event when agent connects to websocket/backend */
|
|
277
293
|
readonly WELCOME: "Welcome";
|
|
278
294
|
/** Event emitted when agent re-login is successful */
|
|
@@ -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/types/types.d.ts
CHANGED
|
@@ -621,6 +621,26 @@ export type UpdateDeviceTypeResponse = Agent.DeviceTypeUpdateSuccess | Error;
|
|
|
621
621
|
* @ignore
|
|
622
622
|
*/
|
|
623
623
|
export type TranscriptAction = 'START' | 'STOP';
|
|
624
|
+
/**
|
|
625
|
+
* Parameters used to request an AI Assistant suggested response.
|
|
626
|
+
* @public
|
|
627
|
+
* @example
|
|
628
|
+
* const params: SuggestedResponseParams = {
|
|
629
|
+
* interactionId: 'interaction-123',
|
|
630
|
+
* actionTimeStamp: Date.now(),
|
|
631
|
+
* context: 'Need help with credit card payment due date',
|
|
632
|
+
* };
|
|
633
|
+
*/
|
|
634
|
+
export type SuggestedResponseParams = {
|
|
635
|
+
/** Agent identifier */
|
|
636
|
+
agentId: string;
|
|
637
|
+
/** Interaction identifier for which suggestion should be generated */
|
|
638
|
+
interactionId: string;
|
|
639
|
+
/** Optional additional context that should refine the suggestion */
|
|
640
|
+
context?: string;
|
|
641
|
+
/** Optional language code for suggestions (for example, 'en'). Defaults to 'en'. */
|
|
642
|
+
languageCode?: string;
|
|
643
|
+
};
|
|
624
644
|
/**
|
|
625
645
|
* Supported AI Assistant event categories.
|
|
626
646
|
* @public
|
|
@@ -652,6 +672,10 @@ export type AIAssistantEventType = Enum<typeof AIAssistantEventType>;
|
|
|
652
672
|
export declare const AIAssistantEventName: {
|
|
653
673
|
/** Request transcript streaming for an interaction */
|
|
654
674
|
readonly GET_TRANSCRIPTS: "GET_TRANSCRIPTS";
|
|
675
|
+
/** Request a suggested response for an interaction */
|
|
676
|
+
readonly GET_SUGGESTIONS: "GET_SUGGESTIONS";
|
|
677
|
+
/** Add extra context to refine a suggested response */
|
|
678
|
+
readonly ADD_SUGGESTIONS_EXTRA_CONTEXT: "ADD_SUGGESTIONS_EXTRA_CONTEXT";
|
|
655
679
|
/** Request mid-call summary generation */
|
|
656
680
|
readonly GET_MID_CALL_SUMMARY: "GET_MID_CALL_SUMMARY";
|
|
657
681
|
/** Request post-call summary generation */
|