@webex/contact-center 3.12.0-task-refactor.9 → 3.12.0-task-refactor.11
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 +51 -2
- package/dist/cc.js.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/services/config/constants.js +1 -1
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/task/Task.js +10 -4
- package/dist/services/task/Task.js.map +1 -1
- package/dist/services/task/TaskManager.js +3 -0
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- package/dist/services/task/types.js +10 -0
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/cc.d.ts +17 -0
- package/dist/types/config.d.ts +6 -0
- package/dist/types/services/task/types.d.ts +11 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +1 -1
- package/package.json +1 -1
- package/src/cc.ts +74 -2
- package/src/config.ts +6 -0
- package/src/services/config/constants.ts +1 -1
- package/src/services/task/Task.ts +9 -4
- package/src/services/task/TaskManager.ts +4 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +1 -1
- package/src/services/task/types.ts +11 -0
- package/src/types.ts +2 -0
- package/test/unit/spec/cc.ts +139 -0
- package/test/unit/spec/services/config/index.ts +1 -1
- package/test/unit/spec/services/task/TaskManager.ts +14 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +47 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebRTC","_stateMachine","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","type","REAL_TIME_TRANSCRIPTION","SUGGESTED_RESPONSE","emit","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","handleIncomingWebCall","call","currentTask","find","t","interaction","mediaType","MEDIA_CHANNEL","TELEPHONY","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","eventPayload","mapEventToTaskStateMachineEvent","AGENT_CONTACT_RESERVED","sendStateMachineEvent","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","ccEvent","mediaResourceId","media","TaskEvent","TASK_INCOMING","taskData","AGENT_OFFER_CONTACT","TASK_OFFERED","AGENT_CONTACT","HYDRATE","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","AGENT_OFFER_CONSULT","OFFER_CONSULT","isConsulted","AGENT_CONTACT_ASSIGNED","ASSIGN","AGENT_CONTACT_HELD","HOLD_SUCCESS","AGENT_CONTACT_UNHELD","UNHOLD_SUCCESS","AGENT_CONSULT_CREATED","CONSULT_CREATED","AGENT_CONSULTING","CONSULTING_ACTIVE","consultDestinationAgentJoined","AGENT_CONSULT_ENDED","CONSULT_END","AGENT_CONSULT_FAILED","AGENT_CTQ_FAILED","CONSULT_FAILED","reason","AGENT_CTQ_CANCELLED","CTQ_CANCEL","AGENT_CTQ_CANCEL_FAILED","CTQ_CANCEL_FAILED","AGENT_BLIND_TRANSFERRED","AGENT_CONSULT_TRANSFERRED","AGENT_VTEAM_TRANSFERRED","TRANSFER_SUCCESS","AGENT_WRAPUP","TASK_WRAPUP","wrapUpRequired","AGENT_CONTACT_UNASSIGNED","AGENT_BLIND_TRANSFER_FAILED","AGENT_VTEAM_TRANSFER_FAILED","AGENT_CONSULT_TRANSFER_FAILED","AGENT_CONFERENCE_TRANSFER_FAILED","TRANSFER_FAILED","CONTACT_ENDED","state","AGENT_INVITE_FAILED","INVITE_FAILED","AGENT_CONTACT_ASSIGN_FAILED","ASSIGN_FAILED","AGENT_CONTACT_OFFER_RONA","RONA","AGENT_OUTBOUND_FAILED","OUTBOUND_FAILED","CONTACT_RECORDING_STARTED","RECORDING_STARTED","CONTACT_RECORDING_PAUSED","PAUSE_RECORDING","CONTACT_RECORDING_RESUMED","RESUME_RECORDING","AGENT_WRAPPEDUP","WRAPUP_COMPLETE","AGENT_CONSULT_CONFERENCED","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEFT_CONFERENCE","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","wasConsultedTask","Boolean","computeWrapUpRequired","undefined","adjustedPayload","context","handleContactReserved","handleAgentContact","CONTACT_MERGED","handleContactMergedEvent","isConsultedTask","isSecondaryEpDnAgent","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","isAutoAnswering","TaskFactory","createTask","setupTaskListeners","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","Error","snapshot","stateMachineService","getSnapshot","isConsultingFlow","destAgentId","consultDestinationAgentId","destinationType","consultDestinationType","REGISTER_TASK_LISTENERS","TASK_HYDRATE","TASK_CLEANUP","options","handleTaskCleanup","removeFromCollection","removeTaskFromCollection","cancelAutoWrapupTimer","REMOVE_TASK_FROM_COLLECTION","childInteractionId","TASK_MERGED","LoginOption","BROWSER","WebRTC","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","agentsPendingWrapUp","length","action","TRANSCRIPT_EVENT_MAP","aiFeature","realtimeTranscripts","enable","sendEvent","AIAssistantEventType","CUSTOM_EVENT","AIAssistantEventName","GET_TRANSCRIPTS","catch","REQUEST_REAL_TIME_TRANSCRIPTS","getTask","taskId","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {\n MEDIA_CHANNEL,\n TASK_EVENTS,\n TaskData,\n TaskId,\n ITask,\n WebSocketPayload,\n WebSocketMessage,\n TaskEventActions,\n EventContext,\n} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS, TRANSCRIPT_EVENT_MAP} from './constants';\nimport {CC_EVENTS, WrapupData} from '../config/types';\nimport {ConfigFlags, LoginOption, AIAssistantEventType, AIAssistantEventName} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {getIsConferenceInProgress, isSecondaryEpDnAgent, shouldAutoAnswerTask} from './TaskUtils';\nimport TaskFactory from './TaskFactory';\nimport WebRTC from './voice/WebRTC';\nimport {TaskEvent, type TaskEventPayload} from './state-machine';\nimport {normalizeTaskData} from './taskDataNormalizer';\nimport {ApiAIAssistant} from '../ApiAiAssistant';\n\nconst CC_EVENT_SET = new Set<CC_EVENTS>(Object.values(CC_EVENTS) as CC_EVENTS[]);\n\nconst isCcEvent = (value: string): value is CC_EVENTS => CC_EVENT_SET.has(value as CC_EVENTS);\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private rtdWebSocketManager: WebSocketManager;\n // eslint-disable-next-line no-use-before-define\n private static taskManager: TaskManager;\n private configFlags?: ConfigFlags;\n private wrapupData: WrapupData;\n private agentId: string;\n private webRtcEnabled: boolean;\n private apiAIAssistant?: ApiAIAssistant;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager: WebSocketManager\n ) {\n super();\n this.apiAIAssistant = apiAIAssistant;\n this.contact = contact;\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.rtdWebSocketManager = rtdWebSocketManager;\n this.taskCollection = {};\n this.webRtcEnabled = false;\n\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public handleRealtimeWebsocketEvent(event: string) {\n try {\n const payload = JSON.parse(event);\n\n const interactionId = payload?.data?.data?.conversationId;\n if (!interactionId) return;\n\n const task = this.taskCollection[interactionId];\n if (!task) {\n LoggerProxy.info(`Realtime transcription task not found`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n interactionId,\n });\n\n return;\n }\n\n switch (payload.type) {\n case CC_EVENTS.REAL_TIME_TRANSCRIPTION:\n case CC_EVENTS.SUGGESTED_RESPONSE:\n task.emit(payload.type, payload.data);\n break;\n }\n } catch (error) {\n LoggerProxy.error('Failed to parse RTD WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n error,\n });\n }\n }\n\n /**\n * Set config flags for task creation\n */\n public setConfigFlags(configFlags: ConfigFlags) {\n this.configFlags = configFlags;\n }\n\n /**\n * Set wrapup configuration data\n */\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n /**\n * Set agent ID for task operations\n */\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (t) => t.data.interaction.mediaType === MEDIA_CHANNEL.TELEPHONY\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n\n // Send TASK_INCOMING to state machine - it will emit on the task object\n const eventPayload = TaskManager.mapEventToTaskStateMachineEvent(\n CC_EVENTS.AGENT_CONTACT_RESERVED,\n currentTask.data\n );\n if (eventPayload && currentTask) {\n currentTask.sendStateMachineEvent(eventPayload);\n }\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n /**\n * Map WebSocket CC_EVENTS to state machine TaskEvent\n * @param ccEvent - The CC_EVENT type from WebSocket\n * @param payload - The event payload\n * @param agentId - Optional agent ID for state detection (needed for HYDRATE)\n * @returns TaskEventPayload for state machine or null if no mapping\n */\n private static mapEventToTaskStateMachineEvent(\n ccEvent: CC_EVENTS,\n payload: WebSocketPayload,\n agentId?: string\n ): TaskEventPayload | null {\n const mediaResourceId =\n payload.mediaResourceId ||\n payload.interaction?.media?.[payload.interactionId]?.mediaResourceId;\n\n switch (ccEvent) {\n // CC -> TaskEvent mappings (see TaskStateMachine comment for quick reference)\n case CC_EVENTS.AGENT_CONTACT_RESERVED: // AgentContactReserved -> TASK_INCOMING\n return {type: TaskEvent.TASK_INCOMING, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONTACT: // AgentOfferContact -> TASK_OFFERED\n return {type: TaskEvent.TASK_OFFERED, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT: // AgentContact -> HYDRATE\n // Include agentId for state detection (e.g., checking isWrapUp in participant data)\n return {type: TaskEvent.HYDRATE, taskData: payload, agentId};\n\n case CC_EVENTS.CONTACT_UPDATED:\n return {type: TaskEvent.CONTACT_UPDATED, taskData: payload};\n case CC_EVENTS.CONTACT_OWNER_CHANGED:\n return {type: TaskEvent.CONTACT_OWNER_CHANGED, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONSULT: // AgentOfferConsult -> OFFER_CONSULT\n return {\n type: TaskEvent.OFFER_CONSULT,\n taskData: {...payload, isConsulted: true},\n };\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED: // AgentContactAssigned -> ASSIGN\n return {type: TaskEvent.ASSIGN, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT_HELD:\n return {\n type: TaskEvent.HOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n return {\n type: TaskEvent.UNHOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n return {\n type: TaskEvent.CONSULT_CREATED,\n taskData: {...payload, isConsulted: false},\n };\n\n case CC_EVENTS.AGENT_CONSULTING: // AgentConsulting -> CONSULTING_ACTIVE\n // use context to figure out if it's the initiator or receiver using consultInitiator from context\n return {\n type: TaskEvent.CONSULTING_ACTIVE,\n consultDestinationAgentJoined: true,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_ENDED: // AgentConsultEnded -> CONSULT_END\n return {type: TaskEvent.CONSULT_END, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n case CC_EVENTS.AGENT_CTQ_FAILED:\n return {type: TaskEvent.CONSULT_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n return {type: TaskEvent.CTQ_CANCEL, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n return {type: TaskEvent.CTQ_CANCEL_FAILED, taskData: payload};\n\n case CC_EVENTS.AGENT_BLIND_TRANSFERRED: // AgentBlindTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_CONSULT_TRANSFERRED: // AgentConsultTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED: // AgentVTeamTransferred -> TRANSFER_SUCCESS\n return {\n type: TaskEvent.TRANSFER_SUCCESS,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_WRAPUP:\n return {type: TaskEvent.TASK_WRAPUP, taskData: {...payload, wrapUpRequired: true}};\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n return null; // Add WRAPUP if needed\n\n case CC_EVENTS.AGENT_BLIND_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_VTEAM_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONSULT_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n return {type: TaskEvent.TRANSFER_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_ENDED:\n return {\n type: TaskEvent.CONTACT_ENDED,\n taskData: {\n ...payload,\n wrapUpRequired: payload.interaction?.state !== 'new',\n },\n };\n\n case CC_EVENTS.AGENT_INVITE_FAILED:\n return {type: TaskEvent.INVITE_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n return {type: TaskEvent.ASSIGN_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n return {type: TaskEvent.RONA, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n return {type: TaskEvent.OUTBOUND_FAILED, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.CONTACT_RECORDING_STARTED:\n return {type: TaskEvent.RECORDING_STARTED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n return {type: TaskEvent.PAUSE_RECORDING, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n return {type: TaskEvent.RESUME_RECORDING, taskData: payload};\n\n case CC_EVENTS.AGENT_WRAPPEDUP:\n return {type: TaskEvent.WRAPUP_COMPLETE, taskData: payload};\n\n // Conference events - these trigger state machine transition to CONFERENCING\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const task = this.taskCollection[interactionId];\n\n const wasConsultedTask = Boolean(task?.data?.isConsulted);\n const computeWrapUpRequired = () => {\n if (message.data.wrapUpRequired !== undefined) {\n return message.data.wrapUpRequired;\n }\n if (message.data.isConsulted !== undefined) {\n return !message.data.isConsulted;\n }\n\n return !wasConsultedTask;\n };\n\n const adjustedPayload =\n eventType === CC_EVENTS.AGENT_CONSULT_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_BLIND_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_VTEAM_TRANSFERRED\n ? {\n ...message.data,\n wrapUpRequired: computeWrapUpRequired(),\n }\n : message.data;\n\n const stateMachineEvent = TaskManager.mapEventToTaskStateMachineEvent(\n eventType,\n adjustedPayload,\n this.agentId\n );\n\n LoggerProxy.info(`Handling task event ${eventType}`, {\n module: TASK_MANAGER_FILE,\n method: 'prepareEventContext',\n interactionId,\n });\n\n return {\n eventType,\n payload: adjustedPayload,\n task,\n stateMachineEvent,\n };\n }\n\n /**\n * Handle task lifecycle events and determine required actions\n *\n * Delegates to specific event handlers based on event type. Each handler\n * is responsible for TaskManager-level concerns:\n * - Task creation and collection management\n * - Metrics tracking\n * - Resource cleanup decisions\n *\n * Note: Task-level state transitions and event emissions are handled by\n * the task state machine via sendStateMachineEvent()\n */\n private handleTaskLifecycleEvent(context: EventContext): TaskEventActions {\n const {eventType} = context;\n\n switch (eventType) {\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n return this.handleContactReserved(context);\n\n case CC_EVENTS.AGENT_CONTACT:\n return this.handleAgentContact(context);\n\n case CC_EVENTS.CONTACT_MERGED:\n return this.handleContactMergedEvent(context);\n\n default:\n return {task: context.task};\n }\n }\n\n /**\n * Handle AGENT_CONTACT_RESERVED event\n * Creates a new task; state machine event is sent during processing\n */\n private handleContactReserved(context: EventContext): TaskEventActions {\n const {payload} = context;\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n isAutoAnswering: shouldAutoAnswer,\n };\n\n const task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT event\n * Re-creates task if missing (multi-session scenario)\n */\n private handleAgentContact(context: EventContext): TaskEventActions {\n let {task} = context;\n const {payload} = context;\n\n if (!task) {\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isAutoAnswering: shouldAutoAnswer,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n }\n\n return {task};\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n throw new Error('Task not found for update');\n }\n\n const snapshot = task.stateMachineService?.getSnapshot?.();\n const isConsultingFlow =\n snapshot?.value === 'CONSULTING' || taskData.interaction?.state === 'consulting';\n\n const updateTaskData = isConsultingFlow\n ? {\n ...taskData,\n destAgentId: taskData.destAgentId ?? snapshot?.context?.consultDestinationAgentId ?? null,\n destinationType:\n taskData.destinationType ?? snapshot?.context?.consultDestinationType ?? null,\n }\n : taskData;\n\n task.updateTaskData(updateTaskData);\n this.taskCollection[taskData.interactionId] = task;\n\n return task;\n }\n\n /**\n * Setup listeners for task events that need to be bubbled up to TaskManager\n * This replaces the previous callback injection pattern\n */\n private setupTaskListeners(task: ITask): void {\n // Listen for TASK_INCOMING and re-emit so webex.cc can notify consumers\n task.on(TASK_EVENTS.TASK_INCOMING, (t: ITask) => {\n LoggerProxy.log(`Task incoming event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_INCOMING, t);\n });\n\n // Listen for TASK_HYDRATE on the task and re-emit on TaskManager\n task.on(TASK_EVENTS.TASK_HYDRATE, (t: ITask) => {\n // Task data is already updated by the task itself before emitting\n this.emit(TASK_EVENTS.TASK_HYDRATE, t);\n });\n\n // Listen for internal cleanup signal emitted by the state machine\n task.on(TASK_EVENTS.TASK_CLEANUP, (t: ITask, options?: {removeFromCollection?: boolean}) => {\n this.handleTaskCleanup(t);\n if (options?.removeFromCollection) {\n const interactionId = t?.data?.interactionId;\n if (interactionId && this.taskCollection[interactionId]) {\n this.removeTaskFromCollection(t);\n }\n }\n });\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (typeof task.cancelAutoWrapupTimer === 'function') {\n task.cancelAutoWrapupTimer();\n }\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMergedEvent(context: EventContext): TaskEventActions {\n const {payload} = context;\n let task = context.task;\n\n if (payload.childInteractionId && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === MEDIA_CHANNEL.TELEPHONY &&\n task instanceof WebRTC\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const needsWrapUp = task.data.agentsPendingWrapUp?.length > 0;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if ((isNew && !(isOutdial && needsWrapUp)) || isSecondaryEpDnAgent(task.data.interaction)) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * Sends transcript start/stop event based on the CC event type.\n * Fire-and-forget; errors are logged but do not interrupt event processing.\n */\n private requestRealTimeTranscripts(eventType: string, interactionId: string): void {\n const action = TRANSCRIPT_EVENT_MAP[eventType];\n if (!action || !this.apiAIAssistant) return;\n if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable !== true) return;\n\n this.apiAIAssistant\n .sendEvent(\n this.agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.GET_TRANSCRIPTS,\n action\n )\n .catch((error) => {\n LoggerProxy.error(`Failed to send transcript ${action} event`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REQUEST_REAL_TIME_TRANSCRIPTS,\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n public getAllTasks(): Record<TaskId, ITask> {\n return {...this.taskCollection};\n }\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager?: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager,\n rtdWebSocketManager\n );\n }\n\n return TaskManager.taskManager;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebRTC","_stateMachine","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","type","REAL_TIME_TRANSCRIPTION","SUGGESTED_RESPONSE","emit","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","handleIncomingWebCall","call","currentTask","find","t","interaction","mediaType","MEDIA_CHANNEL","TELEPHONY","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","eventPayload","mapEventToTaskStateMachineEvent","AGENT_CONTACT_RESERVED","sendStateMachineEvent","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","ccEvent","mediaResourceId","media","TaskEvent","TASK_INCOMING","taskData","AGENT_OFFER_CONTACT","TASK_OFFERED","AGENT_CONTACT","HYDRATE","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","AGENT_OFFER_CONSULT","OFFER_CONSULT","isConsulted","AGENT_CONTACT_ASSIGNED","ASSIGN","AGENT_CONTACT_HELD","HOLD_SUCCESS","AGENT_CONTACT_UNHELD","UNHOLD_SUCCESS","AGENT_CONSULT_CREATED","CONSULT_CREATED","AGENT_CONSULTING","CONSULTING_ACTIVE","consultDestinationAgentJoined","AGENT_CONSULT_ENDED","CONSULT_END","AGENT_CONSULT_FAILED","AGENT_CTQ_FAILED","CONSULT_FAILED","reason","AGENT_CTQ_CANCELLED","CTQ_CANCEL","AGENT_CTQ_CANCEL_FAILED","CTQ_CANCEL_FAILED","AGENT_BLIND_TRANSFERRED","AGENT_CONSULT_TRANSFERRED","AGENT_VTEAM_TRANSFERRED","TRANSFER_SUCCESS","AGENT_WRAPUP","TASK_WRAPUP","wrapUpRequired","AGENT_CONTACT_UNASSIGNED","AGENT_BLIND_TRANSFER_FAILED","AGENT_VTEAM_TRANSFER_FAILED","AGENT_CONSULT_TRANSFER_FAILED","AGENT_CONFERENCE_TRANSFER_FAILED","TRANSFER_FAILED","CONTACT_ENDED","state","AGENT_INVITE_FAILED","INVITE_FAILED","AGENT_CONTACT_ASSIGN_FAILED","ASSIGN_FAILED","AGENT_CONTACT_OFFER_RONA","RONA","AGENT_OUTBOUND_FAILED","OUTBOUND_FAILED","CONTACT_RECORDING_STARTED","RECORDING_STARTED","CONTACT_RECORDING_PAUSED","PAUSE_RECORDING","CONTACT_RECORDING_RESUMED","RESUME_RECORDING","AGENT_WRAPPEDUP","WRAPUP_COMPLETE","AGENT_CONSULT_CONFERENCED","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEFT_CONFERENCE","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","wasConsultedTask","Boolean","computeWrapUpRequired","undefined","adjustedPayload","context","handleContactReserved","handleAgentContact","CONTACT_MERGED","handleContactMergedEvent","isConsultedTask","isSecondaryEpDnAgent","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","isAutoAnswering","TaskFactory","createTask","setupTaskListeners","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","Error","snapshot","stateMachineService","getSnapshot","isConsultingFlow","destAgentId","consultDestinationAgentId","destinationType","consultDestinationType","REGISTER_TASK_LISTENERS","TASK_HYDRATE","TASK_MULTI_LOGIN_HYDRATE","TASK_CLEANUP","options","handleTaskCleanup","removeFromCollection","removeTaskFromCollection","cancelAutoWrapupTimer","REMOVE_TASK_FROM_COLLECTION","childInteractionId","TASK_MERGED","LoginOption","BROWSER","WebRTC","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","agentsPendingWrapUp","length","action","TRANSCRIPT_EVENT_MAP","aiFeature","realtimeTranscripts","enable","sendEvent","AIAssistantEventType","CUSTOM_EVENT","AIAssistantEventName","GET_TRANSCRIPTS","catch","REQUEST_REAL_TIME_TRANSCRIPTS","getTask","taskId","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {\n MEDIA_CHANNEL,\n TASK_EVENTS,\n TaskData,\n TaskId,\n ITask,\n WebSocketPayload,\n WebSocketMessage,\n TaskEventActions,\n EventContext,\n} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS, TRANSCRIPT_EVENT_MAP} from './constants';\nimport {CC_EVENTS, WrapupData} from '../config/types';\nimport {ConfigFlags, LoginOption, AIAssistantEventType, AIAssistantEventName} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {getIsConferenceInProgress, isSecondaryEpDnAgent, shouldAutoAnswerTask} from './TaskUtils';\nimport TaskFactory from './TaskFactory';\nimport WebRTC from './voice/WebRTC';\nimport {TaskEvent, type TaskEventPayload} from './state-machine';\nimport {normalizeTaskData} from './taskDataNormalizer';\nimport {ApiAIAssistant} from '../ApiAiAssistant';\n\nconst CC_EVENT_SET = new Set<CC_EVENTS>(Object.values(CC_EVENTS) as CC_EVENTS[]);\n\nconst isCcEvent = (value: string): value is CC_EVENTS => CC_EVENT_SET.has(value as CC_EVENTS);\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private rtdWebSocketManager: WebSocketManager;\n // eslint-disable-next-line no-use-before-define\n private static taskManager: TaskManager;\n private configFlags?: ConfigFlags;\n private wrapupData: WrapupData;\n private agentId: string;\n private webRtcEnabled: boolean;\n private apiAIAssistant?: ApiAIAssistant;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager: WebSocketManager\n ) {\n super();\n this.apiAIAssistant = apiAIAssistant;\n this.contact = contact;\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.rtdWebSocketManager = rtdWebSocketManager;\n this.taskCollection = {};\n this.webRtcEnabled = false;\n\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public handleRealtimeWebsocketEvent(event: string) {\n try {\n const payload = JSON.parse(event);\n\n const interactionId = payload?.data?.data?.conversationId;\n if (!interactionId) return;\n\n const task = this.taskCollection[interactionId];\n if (!task) {\n LoggerProxy.info(`Realtime transcription task not found`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n interactionId,\n });\n\n return;\n }\n\n switch (payload.type) {\n case CC_EVENTS.REAL_TIME_TRANSCRIPTION:\n case CC_EVENTS.SUGGESTED_RESPONSE:\n task.emit(payload.type, payload.data);\n break;\n }\n } catch (error) {\n LoggerProxy.error('Failed to parse RTD WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n error,\n });\n }\n }\n\n /**\n * Set config flags for task creation\n */\n public setConfigFlags(configFlags: ConfigFlags) {\n this.configFlags = configFlags;\n }\n\n /**\n * Set wrapup configuration data\n */\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n /**\n * Set agent ID for task operations\n */\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (t) => t.data.interaction.mediaType === MEDIA_CHANNEL.TELEPHONY\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n\n // Send TASK_INCOMING to state machine - it will emit on the task object\n const eventPayload = TaskManager.mapEventToTaskStateMachineEvent(\n CC_EVENTS.AGENT_CONTACT_RESERVED,\n currentTask.data\n );\n if (eventPayload && currentTask) {\n currentTask.sendStateMachineEvent(eventPayload);\n }\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n /**\n * Map WebSocket CC_EVENTS to state machine TaskEvent\n * @param ccEvent - The CC_EVENT type from WebSocket\n * @param payload - The event payload\n * @param agentId - Optional agent ID for state detection (needed for HYDRATE)\n * @returns TaskEventPayload for state machine or null if no mapping\n */\n private static mapEventToTaskStateMachineEvent(\n ccEvent: CC_EVENTS,\n payload: WebSocketPayload,\n agentId?: string\n ): TaskEventPayload | null {\n const mediaResourceId =\n payload.mediaResourceId ||\n payload.interaction?.media?.[payload.interactionId]?.mediaResourceId;\n\n switch (ccEvent) {\n // CC -> TaskEvent mappings (see TaskStateMachine comment for quick reference)\n case CC_EVENTS.AGENT_CONTACT_RESERVED: // AgentContactReserved -> TASK_INCOMING\n return {type: TaskEvent.TASK_INCOMING, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONTACT: // AgentOfferContact -> TASK_OFFERED\n return {type: TaskEvent.TASK_OFFERED, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT: // AgentContact -> HYDRATE\n // Include agentId for state detection (e.g., checking isWrapUp in participant data)\n return {type: TaskEvent.HYDRATE, taskData: payload, agentId};\n\n case CC_EVENTS.CONTACT_UPDATED:\n return {type: TaskEvent.CONTACT_UPDATED, taskData: payload};\n case CC_EVENTS.CONTACT_OWNER_CHANGED:\n return {type: TaskEvent.CONTACT_OWNER_CHANGED, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONSULT: // AgentOfferConsult -> OFFER_CONSULT\n return {\n type: TaskEvent.OFFER_CONSULT,\n taskData: {...payload, isConsulted: true},\n };\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED: // AgentContactAssigned -> ASSIGN\n return {type: TaskEvent.ASSIGN, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT_HELD:\n return {\n type: TaskEvent.HOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n return {\n type: TaskEvent.UNHOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n return {\n type: TaskEvent.CONSULT_CREATED,\n taskData: {...payload, isConsulted: false},\n };\n\n case CC_EVENTS.AGENT_CONSULTING: // AgentConsulting -> CONSULTING_ACTIVE\n // use context to figure out if it's the initiator or receiver using consultInitiator from context\n return {\n type: TaskEvent.CONSULTING_ACTIVE,\n consultDestinationAgentJoined: true,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_ENDED: // AgentConsultEnded -> CONSULT_END\n return {type: TaskEvent.CONSULT_END, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n case CC_EVENTS.AGENT_CTQ_FAILED:\n return {type: TaskEvent.CONSULT_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n return {type: TaskEvent.CTQ_CANCEL, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n return {type: TaskEvent.CTQ_CANCEL_FAILED, taskData: payload};\n\n case CC_EVENTS.AGENT_BLIND_TRANSFERRED: // AgentBlindTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_CONSULT_TRANSFERRED: // AgentConsultTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED: // AgentVTeamTransferred -> TRANSFER_SUCCESS\n return {\n type: TaskEvent.TRANSFER_SUCCESS,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_WRAPUP:\n return {type: TaskEvent.TASK_WRAPUP, taskData: {...payload, wrapUpRequired: true}};\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n return null; // Add WRAPUP if needed\n\n case CC_EVENTS.AGENT_BLIND_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_VTEAM_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONSULT_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n return {type: TaskEvent.TRANSFER_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_ENDED:\n return {\n type: TaskEvent.CONTACT_ENDED,\n taskData: {\n ...payload,\n wrapUpRequired: payload.interaction?.state !== 'new',\n },\n };\n\n case CC_EVENTS.AGENT_INVITE_FAILED:\n return {type: TaskEvent.INVITE_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n return {type: TaskEvent.ASSIGN_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n return {type: TaskEvent.RONA, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n return {type: TaskEvent.OUTBOUND_FAILED, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.CONTACT_RECORDING_STARTED:\n return {type: TaskEvent.RECORDING_STARTED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n return {type: TaskEvent.PAUSE_RECORDING, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n return {type: TaskEvent.RESUME_RECORDING, taskData: payload};\n\n case CC_EVENTS.AGENT_WRAPPEDUP:\n return {type: TaskEvent.WRAPUP_COMPLETE, taskData: payload};\n\n // Conference events - these trigger state machine transition to CONFERENCING\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const task = this.taskCollection[interactionId];\n\n const wasConsultedTask = Boolean(task?.data?.isConsulted);\n const computeWrapUpRequired = () => {\n if (message.data.wrapUpRequired !== undefined) {\n return message.data.wrapUpRequired;\n }\n if (message.data.isConsulted !== undefined) {\n return !message.data.isConsulted;\n }\n\n return !wasConsultedTask;\n };\n\n const adjustedPayload =\n eventType === CC_EVENTS.AGENT_CONSULT_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_BLIND_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_VTEAM_TRANSFERRED\n ? {\n ...message.data,\n wrapUpRequired: computeWrapUpRequired(),\n }\n : message.data;\n\n const stateMachineEvent = TaskManager.mapEventToTaskStateMachineEvent(\n eventType,\n adjustedPayload,\n this.agentId\n );\n\n LoggerProxy.info(`Handling task event ${eventType}`, {\n module: TASK_MANAGER_FILE,\n method: 'prepareEventContext',\n interactionId,\n });\n\n return {\n eventType,\n payload: adjustedPayload,\n task,\n stateMachineEvent,\n };\n }\n\n /**\n * Handle task lifecycle events and determine required actions\n *\n * Delegates to specific event handlers based on event type. Each handler\n * is responsible for TaskManager-level concerns:\n * - Task creation and collection management\n * - Metrics tracking\n * - Resource cleanup decisions\n *\n * Note: Task-level state transitions and event emissions are handled by\n * the task state machine via sendStateMachineEvent()\n */\n private handleTaskLifecycleEvent(context: EventContext): TaskEventActions {\n const {eventType} = context;\n\n switch (eventType) {\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n return this.handleContactReserved(context);\n\n case CC_EVENTS.AGENT_CONTACT:\n return this.handleAgentContact(context);\n\n case CC_EVENTS.CONTACT_MERGED:\n return this.handleContactMergedEvent(context);\n\n default:\n return {task: context.task};\n }\n }\n\n /**\n * Handle AGENT_CONTACT_RESERVED event\n * Creates a new task; state machine event is sent during processing\n */\n private handleContactReserved(context: EventContext): TaskEventActions {\n const {payload} = context;\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n isAutoAnswering: shouldAutoAnswer,\n };\n\n const task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT event\n * Re-creates task if missing (multi-session scenario)\n */\n private handleAgentContact(context: EventContext): TaskEventActions {\n let {task} = context;\n const {payload} = context;\n\n if (!task) {\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isAutoAnswering: shouldAutoAnswer,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n }\n\n return {task};\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n throw new Error('Task not found for update');\n }\n\n const snapshot = task.stateMachineService?.getSnapshot?.();\n const isConsultingFlow =\n snapshot?.value === 'CONSULTING' || taskData.interaction?.state === 'consulting';\n\n const updateTaskData = isConsultingFlow\n ? {\n ...taskData,\n destAgentId: taskData.destAgentId ?? snapshot?.context?.consultDestinationAgentId ?? null,\n destinationType:\n taskData.destinationType ?? snapshot?.context?.consultDestinationType ?? null,\n }\n : taskData;\n\n task.updateTaskData(updateTaskData);\n this.taskCollection[taskData.interactionId] = task;\n\n return task;\n }\n\n /**\n * Setup listeners for task events that need to be bubbled up to TaskManager\n * This replaces the previous callback injection pattern\n */\n private setupTaskListeners(task: ITask): void {\n // Listen for TASK_INCOMING and re-emit so webex.cc can notify consumers\n task.on(TASK_EVENTS.TASK_INCOMING, (t: ITask) => {\n LoggerProxy.log(`Task incoming event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_INCOMING, t);\n });\n\n // Listen for TASK_HYDRATE on the task and re-emit on TaskManager\n task.on(TASK_EVENTS.TASK_HYDRATE, (t: ITask) => {\n // Task data is already updated by the task itself before emitting\n this.emit(TASK_EVENTS.TASK_HYDRATE, t);\n });\n\n task.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, (t: ITask) => {\n this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, t);\n });\n\n // Listen for internal cleanup signal emitted by the state machine\n task.on(TASK_EVENTS.TASK_CLEANUP, (t: ITask, options?: {removeFromCollection?: boolean}) => {\n this.handleTaskCleanup(t);\n if (options?.removeFromCollection) {\n const interactionId = t?.data?.interactionId;\n if (interactionId && this.taskCollection[interactionId]) {\n this.removeTaskFromCollection(t);\n }\n }\n });\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (typeof task.cancelAutoWrapupTimer === 'function') {\n task.cancelAutoWrapupTimer();\n }\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMergedEvent(context: EventContext): TaskEventActions {\n const {payload} = context;\n let task = context.task;\n\n if (payload.childInteractionId && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === MEDIA_CHANNEL.TELEPHONY &&\n task instanceof WebRTC\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const needsWrapUp = task.data.agentsPendingWrapUp?.length > 0;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if ((isNew && !(isOutdial && needsWrapUp)) || isSecondaryEpDnAgent(task.data.interaction)) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * Sends transcript start/stop event based on the CC event type.\n * Fire-and-forget; errors are logged but do not interrupt event processing.\n */\n private requestRealTimeTranscripts(eventType: string, interactionId: string): void {\n const action = TRANSCRIPT_EVENT_MAP[eventType];\n if (!action || !this.apiAIAssistant) return;\n if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable !== true) return;\n\n this.apiAIAssistant\n .sendEvent(\n this.agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.GET_TRANSCRIPTS,\n action\n )\n .catch((error) => {\n LoggerProxy.error(`Failed to send transcript ${action} event`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REQUEST_REAL_TIME_TRANSCRIPTS,\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n public getAllTasks(): Record<TaskId, ITask> {\n return {...this.taskCollection};\n }\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager?: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager,\n rtdWebSocketManager\n );\n }\n\n return TaskManager.taskManager;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -256,7 +256,7 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
|
|
|
256
256
|
if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;
|
|
257
257
|
if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;
|
|
258
258
|
if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;
|
|
259
|
-
if (!config.isEndTaskEnabled) return DISABLED;
|
|
259
|
+
if (!config.isEndTaskEnabled && !isWebrtc) return DISABLED;
|
|
260
260
|
if (hasParallelConsultLeg) {
|
|
261
261
|
return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;
|
|
262
262
|
}
|
|
@@ -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","hasConsultMediaInInteraction","interaction","consultMediaResourceId","media","hasConsultLeg","Object","values","some","entry","mType","Boolean","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","participants","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","selfAgentId","agentId","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultInitiator","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","recordingControlsAvailable","isEpDnConsult","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","isWrappingUp","WRAPPING_UP","selfInMainCall","includes","consultMedia","find","mediaResourceId","selfParticipant","selfInConsultCall","hasConsultMedia","isConsultEndedForSelf","type","consultState","isConsulted","effectiveConsultInitiator","effectiveConsultCallHeld","effectiveConsultFromConference","effectiveConsultDestinationAgentJoined","effectiveHasConsultMedia","isConsultDestinationReady","conferenceActive","inConference","isSoleAgentOnCall","getIsConsultedAgentForControls","isActive","hasFullControls","consultOwnedBySelf","consultingAgentId","selfConsultPendingOnConsultMedia","ownerParticipant","owner","undefined","otherAgentConsultInProgress","participant","id","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","callProcessingDetails","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","isConsultRequestedPhase","isConsultUnansweredFailure","recordingControl","isRecordingEnabled","OFFERED","isTerminated","canHold","isConsultedActiveMainLeg","isEndTaskEnabled","isConnectedOrHeld","canRetryConsult","canFromConference","canFromConnected","isEndConsultEnabled","consultingFromConference","consultLegTransferAvailable","selfConsultingOnParticipantState","conferenceTransferAvailable","computeDigitalInteractionUIControls","getVoiceLegState","mainState","isConsultingState","selfConsultingOnConsultMedia","isHold","resolvedMainId","isMainHeld","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\n/** Consult media must exist on the interaction payload, not only as a stale resource id. */\nfunction hasConsultMediaInInteraction(\n interaction: TaskData['interaction'] | undefined,\n consultMediaResourceId?: string\n): boolean {\n const media = interaction?.media ?? {};\n const hasConsultLeg = Object.values(media).some((entry: any) => entry?.mType === 'consult');\n\n if (hasConsultLeg) return true;\n if (!consultMediaResourceId) return false;\n\n return Boolean(media[consultMediaResourceId]);\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // Prefer live task.data (fallback) over stale state-machine snapshot during multi-login sync.\n const taskData = fallbackTaskData ?? context.taskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const isWebrtc = config.voiceVariant === VOICE_VARIANT.WEBRTC;\n const isOutdial = interaction?.outboundType === 'OUTDIAL';\n const serverHold = getServerHoldStateForControls(context, mainCallId, fallbackTaskData);\n\n // Backend-derived checks\n const customerInCall =\n interaction && mainCallId ? getIsCustomerInCall(interaction, mainCallId) : false;\n // EP-DN/secondary legs can have incomplete media participant lists; fall back to participants map.\n const customerPresent =\n customerInCall ||\n Boolean(\n interaction &&\n interaction.participants &&\n Object.values(interaction.participants).some(\n (p: any) => p?.pType === 'Customer' && !p?.hasLeft\n )\n );\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n const maxParticipants = participantCount >= MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const conferenceFromBackend = taskData ? getIsConferenceInProgress(taskData) : false;\n // Note: ownership is used by some controls; keep computations local to those controls\n\n // Context flags (set by state machine actions)\n const {\n consultInitiator,\n consultDestinationAgentJoined,\n consultDestinationType,\n consultCallHeld,\n consultFromConference,\n } = context;\n const {recordingControlsAvailable} = context;\n\n // EP_DN consults are \"ready\" as soon as the consult is created (EP accepts routing immediately).\n // Backend sends destinationType as 'EP-DN'; SDK method uses 'entryPoint' — check both.\n const isEpDnConsult =\n consultDestinationType === 'entryPoint' || consultDestinationType === ('EP-DN' as any);\n\n const stateImpliesHeld = state === TaskState.HELD || state === TaskState.RESUME_INITIATING;\n const stateImpliesConnected =\n state === TaskState.CONNECTED || state === TaskState.HOLD_INITIATING;\n const isHeld = stateImpliesHeld || serverHold === true;\n const isConnected = stateImpliesConnected || (!stateImpliesHeld && serverHold === false);\n\n // State categories for cleaner logic\n const isConsulting =\n state === TaskState.CONSULTING ||\n state === TaskState.CONSULT_INITIATING ||\n state === TaskState.CONF_INITIATING;\n const isConferencing = state === TaskState.CONFERENCING;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n const selfInMainCall =\n Boolean(selfAgentId) &&\n Boolean(mainCallId) &&\n Boolean(interaction?.media?.[mainCallId]?.participants?.includes(selfAgentId as string));\n const consultMedia = Object.values(interaction?.media ?? {}).find(\n (media: any) =>\n media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult'\n ) as {participants?: string[]} | undefined;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const selfInConsultCall =\n Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId as string));\n const hasConsultMedia = hasConsultMediaInInteraction(\n interaction,\n taskData?.consultMediaResourceId\n );\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n taskData?.type === 'AgentConsultFailed' ||\n (selfParticipant?.consultState === 'consultCompleted' &&\n !hasConsultMedia &&\n taskData?.isConsulted === false);\n const effectiveConsultInitiator = isConsultEndedForSelf ? false : consultInitiator;\n const effectiveConsultCallHeld = isConsultEndedForSelf ? false : consultCallHeld;\n const effectiveConsultFromConference = isConsultEndedForSelf ? false : consultFromConference;\n const effectiveConsultDestinationAgentJoined = isConsultEndedForSelf\n ? false\n : consultDestinationAgentJoined;\n // After a consult ends for self, the backend stops sending consult media but the merged\n // task.data can still carry the stale consult-media entry (reconcileData never deletes keys).\n // Treat it as gone so post-consult main-leg controls (consult retry) are not blocked.\n const effectiveHasConsultMedia = isConsultEndedForSelf ? false : hasConsultMedia;\n const isConsultDestinationReady = effectiveConsultDestinationAgentJoined || isEpDnConsult;\n const conferenceActive =\n isConferencing || conferenceFromBackend || effectiveConsultFromConference;\n // Treat consult initiator as \"in conference\" even if mainCall participant list lags while consulting.\n const inConference =\n conferenceActive && (isConferencing || selfInMainCall || effectiveConsultInitiator);\n\n // Check if this is a consulted agent (must be after isConsulting is computed).\n const isSoleAgentOnCall =\n participantCount <= 1 && selfInMainCall && !isConsulting && !inConference;\n const isConsulted =\n inConference || isSoleAgentOnCall\n ? false\n : getIsConsultedAgentForControls(taskData, context, isConsulting) ||\n (!effectiveConsultInitiator &&\n (selfParticipant?.isConsulted === true ||\n selfParticipant?.consultState === 'consulting'));\n\n // Active call = can perform call operations\n const isActive =\n state === TaskState.CONNECTED ||\n state === TaskState.HELD ||\n state === TaskState.HOLD_INITIATING ||\n state === TaskState.RESUME_INITIATING ||\n isConsulting ||\n isConferencing;\n\n // Consulted agents have limited controls until they're in conference or wrapup\n // Use inConference (not isConferencing) so controls remain enabled after state downgrade\n const hasFullControls = !isConsulted || effectiveConsultInitiator || inConference || isWrappingUp;\n const consultOwnedBySelf =\n effectiveConsultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const ownerParticipant = interaction?.owner\n ? interaction.participants?.[interaction.owner]\n : undefined;\n const otherAgentConsultInProgress = Boolean(\n interaction?.participants &&\n Object.values(interaction.participants).some((participant: any) => {\n if (!participant || participant.hasLeft) return false;\n if (participant.id === selfAgentId) return false;\n if (participant.pType !== 'AGENT') return false;\n\n return (\n participant.consultState === 'consultInitiated' ||\n participant.consultState === 'consultReserved' ||\n participant.consultState === 'consulting' ||\n participant.currentState === 'consulting'\n );\n })\n );\n const isHydratedConferenceConsultPending =\n inConference && selfConsultPendingOnConsultMedia && !effectiveConsultDestinationAgentJoined;\n const hasParallelConsultLeg =\n !isConsultEndedForSelf &&\n consultOwnedBySelf &&\n !isConsulting &&\n !isConsulted &&\n (consultInProgress || effectiveConsultCallHeld || hasConsultMedia);\n const activeLegForConferenceConsult = effectiveConsultCallHeld ? 'main' : 'consult';\n const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;\n const isConferenceConsultTransferContext =\n inConference && effectiveConsultInitiator && hasConsultMedia && isConsultDestinationReady;\n const consultLegOnHold = isConsulting && effectiveConsultCallHeld;\n const callProcessingDetails = interaction?.callProcessingDetails as\n | {conferenceHoldParticipant?: boolean | string}\n | undefined;\n const conferenceHoldParticipant =\n callProcessingDetails?.conferenceHoldParticipant === true ||\n callProcessingDetails?.conferenceHoldParticipant === 'true';\n const postDeclineHeldMainLeg =\n consultInitiator &&\n !consultDestinationAgentJoined &&\n isHeld &&\n inConference &&\n conferenceHoldParticipant;\n const postConsultCompletedHeldMainLeg =\n selfParticipant?.consultState === 'consultCompleted' && isHeld && inConference && !isConsulting;\n const nonOwnerPostConsultCompletedHeldMainLeg =\n isHeld &&\n inConference &&\n !isConsulting &&\n !consultInitiator &&\n Boolean(selfAgentId) &&\n Boolean(interaction?.owner) &&\n selfAgentId !== interaction?.owner &&\n ownerParticipant?.consultState === 'consultCompleted';\n const isConsultPendingBeforeJoin =\n selfParticipant?.consultState === 'consultInitiated' && !consultDestinationAgentJoined;\n const hideExitConferenceWhileConsultPending =\n currentLeg === 'main' &&\n inConference &&\n isConsultPendingBeforeJoin &&\n (consultFromConference ||\n consultInitiator ||\n taskData?.type === 'AgentConsultCreated' ||\n consultInProgress ||\n isConsulting);\n const hideExitConferenceDuringActiveConsultFromConference =\n inConference &&\n consultInitiator &&\n consultDestinationAgentJoined &&\n (isConsulting ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consulting');\n const hideExitConferenceOnMainLegForEpDnConsultFromConference =\n currentLeg === 'main' &&\n inConference &&\n consultFromConference &&\n consultInitiator &&\n (isConsulting ||\n consultInProgress ||\n taskData?.type === 'AgentConsultCreated' ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consultInitiated' ||\n selfParticipant?.consultState === 'consulting');\n const forceHeldPostConsultControls =\n !hideExitConferenceWhileConsultPending &&\n (postDeclineHeldMainLeg || postConsultCompletedHeldMainLeg);\n const selfOnConsultLeg =\n selfParticipant?.consultState === 'consulting' ||\n selfParticipant?.currentState === 'consulting';\n const showMainLegConferenceControlsDuringConsult =\n currentLeg === 'main' && inConference && consultInProgress && !selfOnConsultLeg;\n const allowHeldMainLegControlsForNonInitiator =\n showMainLegConferenceControlsDuringConsult && !isHydratedConferenceConsultPending;\n const isConsultRequestedPhase =\n isConsultPendingBeforeJoin &&\n !isConsulted &&\n (consultInitiator ||\n (Boolean(selfAgentId) &&\n selfParticipant?.consultState === 'consultInitiated' &&\n taskData?.agentId === selfAgentId));\n const isConsultUnansweredFailure =\n currentLeg === 'main' &&\n !inConference &&\n !taskData?.isConsulted &&\n !effectiveHasConsultMedia &&\n isHeld &&\n selfParticipant?.consultState === 'consultCompleted' &&\n (taskData?.type === 'AgentConsultFailed' ||\n taskData?.type === 'AgentConsultEnded' ||\n isConsultEndedForSelf);\n\n if (isConsultUnansweredFailure) {\n const recordingControl =\n recordingControlsAvailable && config.isRecordingEnabled && !inConference\n ? VISIBLE_ENABLED\n : DISABLED;\n\n return {\n ...getDefaultInteractionUIControls(),\n hold: VISIBLE_ENABLED,\n transfer: VISIBLE_ENABLED,\n consult: VISIBLE_ENABLED,\n recording: recordingControl,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (isConsultRequestedPhase) {\n if (currentLeg === 'main') {\n return {\n ...getDefaultInteractionUIControls(),\n transfer: VISIBLE_DISABLED,\n conference: VISIBLE_DISABLED,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (currentLeg === 'consult') {\n return {\n ...getDefaultInteractionUIControls(),\n endConsult: VISIBLE_ENABLED,\n switch: VISIBLE_DISABLED,\n transfer: VISIBLE_DISABLED,\n transferConference: inConference ? VISIBLE_DISABLED : DISABLED,\n mergeToConference: VISIBLE_DISABLED,\n };\n }\n }\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_ENABLED;\n if (\n consultOwnedBySelf &&\n (isConsulting || hasParallelConsultLeg || effectiveConsultCallHeld)\n ) {\n return DISABLED;\n }\n if (hasParallelConsultLeg) return DISABLED;\n if (state === TaskState.OFFERED) return DISABLED;\n if (isWrappingUp) return DISABLED;\n // Visibility: connected || held || inConference\n if (!(isConnected || isHeld || inConference)) return DISABLED;\n // Enabled: (connected || held) && !inConference && !isConsulting\n const canHold = (isConnected || isHeld) && !inConference && !isConsulting;\n\n return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Mute: WebRTC only, active calls; hidden entirely during wrapup\n mute: (() => {\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (currentLeg === 'consult' && !selfInConsultCall) return DISABLED;\n // The consulted agent has no separate consult leg; their main leg is the active call, so\n // mute stays available while they consult (the heuristic below targets the initiator's\n // inactive leg, not the consultee's only leg).\n const isConsultedActiveMainLeg = isConsulted && currentLeg === 'main';\n if (\n (isConsulting || hasParallelConsultLeg) &&\n !isCurrentLegActive &&\n !isConsultedActiveMainLeg\n ) {\n return VISIBLE_DISABLED;\n }\n if (isConsulting) return VISIBLE_ENABLED;\n\n if (isConnected || isHeld || isConferencing) {\n if (inConference) return VISIBLE_ENABLED;\n\n return isHeld ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // End: varies by state; during consulting only on main leg (consult held)\n end: (() => {\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (!config.isEndTaskEnabled) return DISABLED;\n if (hasParallelConsultLeg) {\n return isConnected && isEpDnConsult ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (isConsulting) {\n if (currentLeg === 'consult' && consultCallHeld) return DISABLED;\n\n return consultInitiator && consultCallHeld ? VISIBLE_ENABLED : DISABLED;\n }\n\n if (inConference) {\n if (isConsulted) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n\n if (consultInProgress) return VISIBLE_DISABLED;\n\n return isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (isActive) return isHeld || isWrappingUp ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Transfer: connected/held/conference\n transfer: (() => {\n if (isHydratedConferenceConsultPending) return VISIBLE_DISABLED;\n if (isConferenceConsultTransferContext && currentLeg === 'main' && isCurrentLegActive) {\n return DISABLED;\n }\n if (inConference && isConsulting && consultInitiator) return DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) return VISIBLE_ENABLED;\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n }\n if (isConsulting) {\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n if (!hasFullControls) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): transfer is hidden\n // Pending conference (only self agent): transfer remains available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.CONNECTED || state === TaskState.HELD) return VISIBLE_ENABLED;\n\n return DISABLED;\n })(),\n\n // Consult: connected/held/conference when conditions met\n consult: (() => {\n const isConnectedOrHeld = state === TaskState.CONNECTED || state === TaskState.HELD;\n\n if (\n isHeld &&\n !inConference &&\n !effectiveHasConsultMedia &&\n selfParticipant?.consultState === 'consultCompleted' &&\n !taskData?.isConsulted\n ) {\n const canRetryConsult = !maxParticipants && customerPresent && !otherAgentConsultInProgress;\n\n return {isVisible: true, isEnabled: canRetryConsult};\n }\n\n if (inConference && nonOwnerPostConsultCompletedHeldMainLeg) return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) return DISABLED;\n if (!hasFullControls || !(isConnectedOrHeld || inConference)) {\n return DISABLED;\n }\n\n // In conference: behavior depends on whether it's a real multi-agent conference\n if (inConference) {\n // Pending conference (only self agent): consult disabled\n if (participantCount <= 1) return VISIBLE_DISABLED;\n // Real conference: consult enabled if conditions met\n const canFromConference =\n !maxParticipants &&\n customerPresent &&\n !consultInProgress &&\n !otherAgentConsultInProgress &&\n !isConsulting;\n\n return {isVisible: true, isEnabled: canFromConference};\n }\n\n // Enabled conditions for connected/held\n const canFromConnected =\n !maxParticipants && customerPresent && !consultInProgress && !isConsulted;\n\n return {isVisible: true, isEnabled: canFromConnected};\n })(),\n\n // ConsultTransfer: always hidden (use transfer button)\n consultTransfer: DISABLED,\n\n // EndConsult: during consulting\n endConsult: (() => {\n if (!isConsulting) return DISABLED;\n if (isConsulted && isConferencing) return DISABLED;\n if (!isConsulted && isConferencing && !(consultInitiator && conferenceFromBackend)) {\n return DISABLED;\n }\n\n return {isVisible: true, isEnabled: consultInitiator || config.isEndConsultEnabled};\n })(),\n\n // Recording: connected/held, hidden in real conference, visible in pending conference\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Real conference (multiple agents): recording hidden\n // Pending conference (only self agent): recording available\n return participantCount > 1 ? DISABLED : VISIBLE_ENABLED;\n }\n if (hasParallelConsultLeg && !customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED || state === TaskState.HELD) {\n return VISIBLE_ENABLED;\n }\n\n return DISABLED;\n })(),\n\n // Conference: during consulting, enabled on both legs when agent joined\n // Label changes based on leg: \"Conference\" on main leg, \"Merge\" on consult leg\n conference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'main') return VISIBLE_DISABLED;\n if (hasParallelConsultLeg) {\n if (!customerPresent) return DISABLED;\n if (state === TaskState.CONNECTED) {\n return maxParticipants ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.HELD) return VISIBLE_DISABLED;\n\n return DISABLED;\n }\n if (!hasFullControls || !isConsulting) return DISABLED;\n if (!consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Wrapup: wrapping up state\n wrapup: isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n\n // ExitConference: in conference with multiple agents in main call\n exitConference: (() => {\n if (hideExitConferenceWhileConsultPending) return DISABLED;\n if (hideExitConferenceOnMainLegForEpDnConsultFromConference) return DISABLED;\n if (allowHeldMainLegControlsForNonInitiator) return VISIBLE_ENABLED;\n if (showMainLegConferenceControlsDuringConsult) return VISIBLE_DISABLED;\n if (hideExitConferenceDuringActiveConsultFromConference) return DISABLED;\n if (forceHeldPostConsultControls) return VISIBLE_DISABLED;\n if (isConsulted && !isConferencing) return DISABLED;\n if (!inConference) return DISABLED;\n if (participantCount <= 1) return DISABLED;\n if (consultInProgress) return VISIBLE_DISABLED;\n const consultingFromConference = consultInitiator && isConsulting && conferenceFromBackend;\n\n return consultingFromConference ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // TransferConference: in conference with active consult, owner consulting from conference\n transferConference: (() => {\n if (isConferenceConsultTransferContext && !isCurrentLegActive) return VISIBLE_DISABLED;\n const consultLegTransferAvailable =\n currentLeg === 'consult' && inConference && consultInitiator && hasConsultMedia;\n const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';\n const conferenceTransferAvailable =\n consultLegTransferAvailable ||\n (inConference &&\n consultInitiator &&\n hasConsultMedia &&\n (isConsulting || consultInProgress || selfConsultingOnParticipantState));\n if (consultLegOnHold) return DISABLED;\n if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;\n if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;\n if (!consultInitiator || isConsulted) return DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // MergeToConference: mirrors conference control, enabled on both legs\n mergeToConference: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!isConsulting || !consultInitiator) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n if (consultLegOnHold) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady && !maxParticipants ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n })(),\n\n // Switch: visible only on the currently active leg\n switch: (() => {\n if (isHydratedConferenceConsultPending && currentLeg === 'consult') return VISIBLE_DISABLED;\n if (!customerPresent && hasParallelConsultLeg) return DISABLED;\n if (currentLeg === 'consult') {\n if (!isConsulting || !consultInitiator || consultCallHeld) return DISABLED;\n if (!customerPresent) return VISIBLE_DISABLED;\n\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n if (hasParallelConsultLeg && state === TaskState.CONNECTED) {\n return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;\n }\n\n return DISABLED;\n })(),\n };\n}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = fallbackTaskData ?? context.taskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const hasConsultMedia = hasConsultMediaInInteraction(\n interaction,\n taskData?.consultMediaResourceId\n );\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n taskData?.type === 'AgentConsultFailed' ||\n (selfParticipant?.consultState === 'consultCompleted' &&\n !hasConsultMedia &&\n taskData?.isConsulted === false);\n const consultInProgress = getIsConsultInProgressForConferenceControls(\n interaction,\n mainCallId,\n selfAgentId\n );\n const isConsultingState =\n currentState === TaskState.CONSULTING ||\n currentState === TaskState.CONSULT_INITIATING ||\n currentState === TaskState.CONF_INITIATING;\n const consultOwnedBySelf =\n context.consultInitiator ||\n (Boolean(selfAgentId) && taskData?.consultingAgentId === selfAgentId);\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const selfConsultingOnConsultMedia =\n selfParticipant?.consultState === 'consulting' && hasConsultMedia;\n const isConsultUnansweredFailure =\n !taskData?.isConsulted &&\n !hasConsultMedia &&\n selfParticipant?.consultState === 'consultCompleted' &&\n Boolean(mainCallId && taskData?.interaction?.media?.[mainCallId]?.isHold === true) &&\n taskData?.interaction?.state !== 'conference' &&\n !getIsConferenceInProgress(taskData);\n const hasConsultLeg = Boolean(\n !isConsultEndedForSelf &&\n !interaction?.isTerminated &&\n !isConsultUnansweredFailure &&\n (consultOwnedBySelf || selfConsultingOnConsultMedia || selfConsultPendingOnConsultMedia) &&\n (consultInProgress || isConsultingState || context.consultCallHeld || hasConsultMedia)\n );\n\n if (!hasConsultLeg) {\n let mainState = currentState;\n if (isConsultEndedForSelf && taskData?.interaction) {\n const resolvedMainId = taskData.interaction.mainInteractionId || taskData.interactionId;\n const isMainHeld = Boolean(\n resolvedMainId && taskData.interaction.media?.[resolvedMainId]?.isHold === true\n );\n\n if (taskData.interaction.state === 'conference' || getIsConferenceInProgress(taskData)) {\n mainState = TaskState.CONFERENCING;\n } else if (isMainHeld || taskData.interaction.state === 'hold') {\n mainState = TaskState.HELD;\n } else {\n mainState = TaskState.CONNECTED;\n }\n }\n\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n let mainState = TaskState.HELD;\n if (currentState === TaskState.CONFERENCING) {\n mainState = TaskState.CONFERENCING;\n } else if (context.consultCallHeld) {\n mainState = TaskState.CONNECTED;\n }\n\n return {\n hasConsultLeg: true,\n activeLeg: context.consultCallHeld ? 'main' : 'consult',\n mainState,\n consultState: isConsultingState ? currentState : TaskState.CONSULTING,\n };\n}\n\nexport function computeUIControls(\n currentState: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): TaskUIControls {\n if (currentState === TaskState.TERMINATED || currentState === TaskState.COMPLETED) {\n return getDefaultUIControls();\n }\n\n switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
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 && !isWebrtc) 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,IAAI,CAAC7G,QAAQ,EAAE,OAAOjD,QAAQ;MAC1D,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":[]}
|
|
@@ -576,6 +576,16 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
576
576
|
* ```
|
|
577
577
|
*/
|
|
578
578
|
TASK_EVENTS["TASK_POST_CALL_ACTIVITY"] = "task:postCallActivity";
|
|
579
|
+
/**
|
|
580
|
+
* Triggered when a multi-login task update should hydrate SDK instances without Mobius registration.
|
|
581
|
+
* @example
|
|
582
|
+
* ```typescript
|
|
583
|
+
* task.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, (task: ITask) => {
|
|
584
|
+
* console.log('Multi-login hydrate:', task.data.interactionId);
|
|
585
|
+
* });
|
|
586
|
+
* ```
|
|
587
|
+
*/
|
|
588
|
+
TASK_EVENTS["TASK_MULTI_LOGIN_HYDRATE"] = "task:multiLoginHydrate";
|
|
579
589
|
return TASK_EVENTS;
|
|
580
590
|
}({});
|
|
581
591
|
/**
|