@webex/contact-center 3.11.0 → 3.12.0-auth-prejoin-fetch.1
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/.sdd/manifest.json +883 -0
- package/AGENTS.md +94 -0
- package/ai-docs/ARCHITECTURE.md +168 -0
- package/ai-docs/CONTRACTS.md +50 -0
- package/ai-docs/GETTING_STARTED.md +168 -0
- package/ai-docs/GLOSSARY.md +43 -0
- package/ai-docs/README.md +138 -0
- package/ai-docs/REVIEW_CHECKLIST.md +41 -0
- package/ai-docs/RULES.md +444 -0
- package/ai-docs/SECURITY.md +52 -0
- package/ai-docs/SERVICE_STATE.md +48 -0
- package/ai-docs/SPEC_INDEX.md +65 -0
- package/ai-docs/adr/0001-spec-source-policy.md +55 -0
- package/ai-docs/adr/README.md +8 -0
- package/ai-docs/adr/_adr-template.md +31 -0
- package/ai-docs/contact-center-spec.md +359 -0
- package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
- package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
- package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
- package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
- package/ai-docs/patterns/event-driven-patterns.md +485 -0
- package/ai-docs/patterns/testing-patterns.md +480 -0
- package/ai-docs/patterns/typescript-patterns.md +365 -0
- package/ai-docs/templates/README.md +102 -0
- package/ai-docs/templates/documentation/create-agents-md.md +240 -0
- package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
- package/ai-docs/templates/existing-service/bug-fix.md +254 -0
- package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
- package/ai-docs/templates/new-method/00-master.md +80 -0
- package/ai-docs/templates/new-method/01-requirements.md +232 -0
- package/ai-docs/templates/new-method/02-implementation.md +295 -0
- package/ai-docs/templates/new-method/03-tests.md +201 -0
- package/ai-docs/templates/new-method/04-validation.md +141 -0
- package/ai-docs/templates/new-service/00-master.md +109 -0
- package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
- package/ai-docs/templates/new-service/02-code-generation.md +346 -0
- package/ai-docs/templates/new-service/03-integration.md +178 -0
- package/ai-docs/templates/new-service/04-test-generation.md +205 -0
- package/ai-docs/templates/new-service/05-validation.md +145 -0
- package/dist/cc.js +818 -59
- package/dist/cc.js.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +31 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js +27 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +127 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +34 -3
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +18 -15
- package/dist/services/AddressBook.js.map +1 -1
- package/dist/services/AnswerCallOnWebexService.js +174 -0
- package/dist/services/AnswerCallOnWebexService.js.map +1 -0
- package/dist/services/ApiAiAssistant.js +318 -0
- package/dist/services/ApiAiAssistant.js.map +1 -0
- package/dist/services/EntryPoint.js +46 -68
- package/dist/services/EntryPoint.js.map +1 -1
- package/dist/services/Queue.js +27 -22
- package/dist/services/Queue.js.map +1 -1
- package/dist/services/UserPreference.js +427 -0
- package/dist/services/UserPreference.js.map +1 -0
- package/dist/services/WebexCrossClientService.js +171 -0
- package/dist/services/WebexCrossClientService.js.map +1 -0
- package/dist/services/WxAppTelephonyMercurySync.js +93 -0
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
- package/dist/services/agent/types.js.map +1 -1
- package/dist/services/config/Util.js +11 -4
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +45 -8
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +41 -2
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +70 -8
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js +27 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +122 -25
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/WebexRequest.js +6 -2
- package/dist/services/core/WebexRequest.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +119 -30
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/types.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +22 -6
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/connection-service.js +3 -1
- package/dist/services/core/websocket/connection-service.js.map +1 -1
- package/dist/services/core/websocket/types.js.map +1 -1
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/task/Task.js +754 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +49 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +1073 -447
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +220 -23
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/WebexCallingUtils.js +70 -0
- package/dist/services/task/WebexCallingUtils.js.map +1 -0
- package/dist/services/task/constants.js +26 -2
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +29 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/dialer.js +129 -0
- package/dist/services/task/dialer.js.map +1 -1
- package/dist/services/task/digital/Digital.js +78 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +971 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +572 -0
- package/dist/services/task/state-machine/actions.js.map +1 -0
- package/dist/services/task/state-machine/constants.js +161 -0
- package/dist/services/task/state-machine/constants.js.map +1 -0
- package/dist/services/task/state-machine/guards.js +409 -0
- package/dist/services/task/state-machine/guards.js.map +1 -0
- package/dist/services/task/state-machine/index.js +53 -0
- package/dist/services/task/state-machine/index.js.map +1 -0
- package/dist/services/task/state-machine/types.js +54 -0
- package/dist/services/task/state-machine/types.js.map +1 -0
- package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
- package/dist/services/task/taskDataNormalizer.js +99 -0
- package/dist/services/task/taskDataNormalizer.js.map +1 -0
- package/dist/services/task/types.js +243 -5
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1380 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +152 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
- package/dist/services/wxAppTelephonyUtils.js +19 -0
- package/dist/services/wxAppTelephonyUtils.js.map +1 -0
- package/dist/types/cc.d.ts +967 -0
- package/dist/types/config.d.ts +79 -0
- package/dist/types/constants.d.ts +74 -0
- package/dist/types/index.d.ts +201 -0
- package/dist/types/logger-proxy.d.ts +71 -0
- package/dist/types/metrics/MetricsManager.d.ts +223 -0
- package/dist/types/metrics/behavioral-events.d.ts +29 -0
- package/dist/types/metrics/constants.d.ts +183 -0
- package/dist/types/services/AddressBook.d.ts +75 -0
- package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
- package/dist/types/services/ApiAiAssistant.d.ts +49 -0
- package/dist/types/services/EntryPoint.d.ts +69 -0
- package/dist/types/services/Queue.d.ts +78 -0
- package/dist/types/services/UserPreference.d.ts +118 -0
- package/dist/types/services/WebCallingService.d.ts +1 -0
- package/dist/types/services/WebexCrossClientService.d.ts +28 -0
- package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
- package/dist/types/services/agent/index.d.ts +46 -0
- package/dist/types/services/agent/types.d.ts +413 -0
- package/dist/types/services/config/Util.d.ts +20 -0
- package/dist/types/services/config/constants.d.ts +273 -0
- package/dist/types/services/config/index.d.ts +177 -0
- package/dist/types/services/config/types.d.ts +1381 -0
- package/dist/types/services/constants.d.ts +110 -0
- package/dist/types/services/core/Err.d.ts +127 -0
- package/dist/types/services/core/GlobalTypes.d.ts +58 -0
- package/dist/types/services/core/Utils.d.ts +121 -0
- package/dist/types/services/core/WebexRequest.d.ts +23 -0
- package/dist/types/services/core/aqm-reqs.d.ts +65 -0
- package/dist/types/services/core/constants.d.ts +99 -0
- package/dist/types/services/core/types.d.ts +49 -0
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
- package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
- package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
- package/dist/types/services/core/websocket/types.d.ts +37 -0
- package/dist/types/services/index.d.ts +54 -0
- package/dist/types/services/task/AutoWrapup.d.ts +40 -0
- package/dist/types/services/task/Task.d.ts +175 -0
- package/dist/types/services/task/TaskFactory.d.ts +13 -0
- package/dist/types/services/task/TaskManager.d.ts +1 -0
- package/dist/types/services/task/TaskUtils.d.ts +138 -0
- package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
- package/dist/types/services/task/constants.d.ts +94 -0
- package/dist/types/services/task/contact.d.ts +73 -0
- package/dist/types/services/task/dialer.d.ts +73 -0
- package/dist/types/services/task/digital/Digital.d.ts +22 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1398 -0
- package/dist/types/services/task/state-machine/actions.d.ts +10 -0
- package/dist/types/services/task/state-machine/constants.d.ts +107 -0
- package/dist/types/services/task/state-machine/guards.d.ts +103 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +277 -0
- package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
- package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
- package/dist/types/services/task/types.d.ts +1933 -0
- package/dist/types/services/task/voice/Voice.d.ts +223 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
- package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
- package/dist/types/types.d.ts +784 -0
- package/dist/types/utils/PageCache.d.ts +190 -0
- package/dist/types/webex-config.d.ts +53 -0
- package/dist/types/webex.d.ts +8 -0
- package/dist/types.js +137 -3
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +19 -5
- package/dist/utils/PageCache.js.map +1 -1
- package/dist/webex.js +14 -2
- package/dist/webex.js.map +1 -1
- package/package.json +16 -12
- package/src/cc.ts +983 -60
- package/src/config.ts +13 -0
- package/src/constants.ts +29 -1
- package/src/index.ts +26 -5
- package/src/metrics/ai-docs/AGENTS.md +350 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
- package/src/metrics/ai-docs/metrics-spec.md +860 -0
- package/src/metrics/behavioral-events.ts +134 -0
- package/src/metrics/constants.ts +39 -3
- package/src/services/AddressBook.ts +17 -6
- package/src/services/AnswerCallOnWebexService.ts +206 -0
- package/src/services/ApiAiAssistant.ts +412 -0
- package/src/services/EntryPoint.ts +59 -60
- package/src/services/Queue.ts +29 -12
- package/src/services/UserPreference.ts +509 -0
- package/src/services/WebexCrossClientService.ts +212 -0
- package/src/services/WxAppTelephonyMercurySync.ts +115 -0
- package/src/services/agent/ai-docs/AGENTS.md +240 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
- package/src/services/agent/ai-docs/agent-spec.md +504 -0
- package/src/services/agent/types.ts +1 -1
- package/src/services/ai-docs/AGENTS.md +386 -0
- package/src/services/ai-docs/services-spec.md +497 -0
- package/src/services/config/Util.ts +13 -2
- package/src/services/config/ai-docs/AGENTS.md +255 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
- package/src/services/config/ai-docs/config-spec.md +675 -0
- package/src/services/config/constants.ts +47 -7
- package/src/services/config/index.ts +45 -1
- package/src/services/config/types.ts +253 -11
- package/src/services/constants.ts +29 -0
- package/src/services/core/Err.ts +4 -0
- package/src/services/core/Utils.ts +143 -30
- package/src/services/core/WebexRequest.ts +3 -1
- package/src/services/core/ai-docs/AGENTS.md +381 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
- package/src/services/core/ai-docs/core-spec.md +787 -0
- package/src/services/core/aqm-reqs.ts +125 -32
- package/src/services/core/types.ts +2 -0
- package/src/services/core/websocket/WebSocketManager.ts +23 -6
- package/src/services/core/websocket/connection-service.ts +5 -1
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +4 -0
- package/src/services/task/Task.ts +908 -0
- package/src/services/task/TaskFactory.ts +60 -0
- package/src/services/task/TaskManager.ts +1291 -513
- package/src/services/task/TaskUtils.ts +314 -24
- package/src/services/task/WebexCallingUtils.ts +136 -0
- package/src/services/task/ai-docs/AGENTS.md +457 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
- package/src/services/task/ai-docs/task-spec.md +1469 -0
- package/src/services/task/constants.ts +26 -0
- package/src/services/task/contact.ts +30 -0
- package/src/services/task/dialer.ts +136 -1
- package/src/services/task/digital/Digital.ts +97 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +1313 -0
- package/src/services/task/state-machine/actions.ts +741 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +462 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1146 -0
- package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2209 -0
- package/src/services/task/state-machine/constants.ts +172 -0
- package/src/services/task/state-machine/guards.ts +498 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +258 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +843 -70
- package/src/services/task/voice/Voice.ts +1720 -0
- package/src/services/task/voice/WebRTC.ts +191 -0
- package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
- package/src/services/wxAppTelephonyUtils.ts +14 -0
- package/src/types.ts +238 -11
- package/src/utils/AGENTS.md +289 -0
- package/src/utils/PageCache.ts +38 -5
- package/src/utils/ai-docs/utils-spec.md +391 -0
- package/src/webex.js +2 -0
- package/test/unit/spec/cc.ts +1856 -122
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/metrics/behavioral-events.ts +18 -0
- package/test/unit/spec/services/AddressBook.ts +37 -6
- package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
- package/test/unit/spec/services/EntryPoint.ts +87 -40
- package/test/unit/spec/services/Queue.ts +123 -12
- package/test/unit/spec/services/UserPreference.ts +401 -0
- package/test/unit/spec/services/WebCallingService.ts +7 -1
- package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
- package/test/unit/spec/services/config/Util.ts +85 -0
- package/test/unit/spec/services/config/index.ts +85 -29
- package/test/unit/spec/services/core/Utils.ts +481 -2
- package/test/unit/spec/services/core/WebexRequest.ts +3 -1
- package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
- package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +677 -0
- package/test/unit/spec/services/task/TaskFactory.ts +99 -0
- package/test/unit/spec/services/task/TaskManager.ts +2209 -918
- package/test/unit/spec/services/task/TaskUtils.ts +235 -0
- package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
- package/test/unit/spec/services/task/contact.ts +33 -0
- package/test/unit/spec/services/task/dialer.ts +372 -96
- package/test/unit/spec/services/task/digital/Digital.ts +105 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +3433 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +1523 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
- package/dist/services/task/index.js +0 -1525
- package/dist/services/task/index.js.map +0 -1
- package/src/services/task/index.ts +0 -1801
- package/test/unit/spec/services/task/index.ts +0 -2184
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_types","require","_WebexCallingUtils","_constants","_TaskUtils","_constants2","_constants3","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","withWxAppTelephonyControls","controls","isWxAppEngaged","currentLeg","isWrappingUp","mute","keypad","getDefaultInteractionUIControls","accept","decline","hold","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","consultTransferDestinations","getDefaultUIControls","getConsultTransferDestinations","config","taskData","destinationConfig","consultTransferConfig","isVoice","channelType","TASK_CHANNEL_TYPE","VOICE","interaction","direction","contactDirection","type","toUpperCase","destinations","accessBuddyTeam","COLLABORATION_ACCESS","NONE","push","CONSULT_TRANSFER_DESTINATION_TYPE","AGENT","accessQueue","canConsultQueue","allowConsultToQueue","canTransferQueue","INBOUND_DIRECTION","OUTDIAL_DIRECTION","callProcessingDetails","outdialTransferToQueueEnabled","QUEUE","DIALNUMBER","accessEntryPoint","ENTRYPOINT","hasConsultMediaInInteraction","consultMediaResourceId","media","hasConsultLeg","Object","values","some","entry","mType","Boolean","isSelfActiveConsultInitiator","consultInitiator","selfAgentId","selfParticipant","selfInConsultCall","consultingAgentId","consultState","computeVoiceInteractionUIControls","state","context","fallbackTaskData","TaskState","IDLE","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","agentId","enableWxBetterTogether","wxAppDeviceDetails","getWebexCallingDeviceDetailsForAgent","undefined","isWxAppParticipant","deviceType","isWxAppOffer","OFFERED","isWxAppInboundOffer","isWxAppOutdialOffer","wxAppAnswerPending","wxAppAcceptInFlight","isWxAppEngagedForControls","consultInProgress","getIsConsultInProgressForConferenceControls","conferenceFromBackend","getIsConferenceInProgress","consultDestinationAgentJoined","consultDestinationType","consultCallHeld","consultFromConference","hideBlindTransferForEpDnPendingMerge","recordingControlsAvailable","isEpDnConsult","stateImpliesHeld","HELD","RESUME_INITIATING","stateImpliesConnected","CONNECTED","HOLD_INITIATING","isHeld","isConnected","isConsulting","CONSULTING","CONSULT_INITIATING","CONF_INITIATING","isConferencing","CONFERENCING","WRAPPING_UP","selfInMainCall","includes","consultMedia","find","mediaResourceId","hasConsultMedia","isSecondaryConsultRejectedWhileEpDnActive","isSelfConsultCompleted","isConsulted","isConsultEndedForSelf","isEpDnPendingConferenceMergeUi","INTERACTION_STATE","POST_CALL","isEpDnPostCallCustomerLeft","effectiveConsultInProgress","effectiveConsultInitiator","effectiveConsultCallHeld","effectiveConsultFromConference","effectiveConsultDestinationAgentJoined","effectiveHasConsultMedia","isConsultDestinationReady","conferenceActive","inConference","isSoleAgentOnCall","getIsConsultedAgentForControls","isActive","hasFullControls","selfActiveConsultInitiator","consultOwnedBySelf","selfConsultPendingOnConsultMedia","ownerParticipant","owner","otherAgentConsultInProgress","participant","id","String","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","isConsultRequestedPhase","isConsultUnansweredFailure","shouldHideBlindTransferForEpDnPendingConferenceMerge","recordingControl","isRecordingEnabled","isTerminated","canHold","isConsultedActiveMainLeg","isEndTaskEnabled","isConnectedOrHeld","canRetryConsult","canFromConference","canFromConnected","isEndConsultEnabled","consultingFromConference","consultLegTransferAvailable","selfConsultingOnParticipantState","conferenceTransferAvailable","computeDigitalInteractionUIControls","getVoiceLegState","mainState","isConsultingState","selfConsultingOnConsultMedia","isHold","resolvedMainId","isMainHeld","mainMediaId","computeUIControls","TERMINATED","COMPLETED","uiControlConfig","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveDestinationListChanged","length","destination","index","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n CONSULT_TRANSFER_DESTINATION_TYPE,\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {\n getWebexCallingDeviceDetailsForAgent,\n isWxAppEngagedForControls,\n} from '../WebexCallingUtils';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE, INTERACTION_STATE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\nimport {INBOUND_DIRECTION, OUTDIAL_DIRECTION} from '../../../constants';\nimport {COLLABORATION_ACCESS} from '../../config/constants';\n\ntype DestinationControls = TaskUIControls['consultTransferDestinations'];\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\n/** wxApp telephony controls live on the main leg only (mute/keypad via wxApp APIs). */\nfunction withWxAppTelephonyControls(\n controls: InteractionUIControls,\n isWxAppEngaged: boolean,\n currentLeg: TaskUILeg,\n isWrappingUp: boolean\n): InteractionUIControls {\n if (!isWxAppEngaged || isWrappingUp) {\n return controls;\n }\n\n if (currentLeg === 'main') {\n return {\n ...controls,\n mute: VISIBLE_ENABLED,\n keypad: VISIBLE_ENABLED,\n };\n }\n\n return {\n ...controls,\n mute: DISABLED,\n keypad: DISABLED,\n };\n}\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 keypad: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg,\n consultTransferDestinations: DestinationControls = {\n consult: [],\n transfer: [],\n }\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n consultTransferDestinations,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\nfunction getConsultTransferDestinations(\n config: UIControlConfig,\n taskData?: TaskData | null\n): DestinationControls {\n const destinationConfig = config.consultTransferConfig;\n if (!destinationConfig) {\n return {consult: [], transfer: []};\n }\n\n const isVoice = config.channelType === TASK_CHANNEL_TYPE.VOICE;\n const interaction = taskData?.interaction;\n const direction = interaction?.contactDirection?.type?.toUpperCase();\n const destinations: DestinationControls = {\n consult: [],\n transfer: [],\n };\n\n if (destinationConfig.accessBuddyTeam?.toUpperCase() !== COLLABORATION_ACCESS.NONE) {\n destinations.consult.push(CONSULT_TRANSFER_DESTINATION_TYPE.AGENT);\n destinations.transfer.push(CONSULT_TRANSFER_DESTINATION_TYPE.AGENT);\n }\n\n if (destinationConfig.accessQueue?.toUpperCase() !== COLLABORATION_ACCESS.NONE) {\n const canConsultQueue = !isVoice || destinationConfig.allowConsultToQueue;\n const canTransferQueue =\n !isVoice ||\n direction === INBOUND_DIRECTION ||\n (direction === OUTDIAL_DIRECTION &&\n interaction?.callProcessingDetails?.outdialTransferToQueueEnabled === true);\n\n if (canConsultQueue) destinations.consult.push(CONSULT_TRANSFER_DESTINATION_TYPE.QUEUE);\n if (canTransferQueue) destinations.transfer.push(CONSULT_TRANSFER_DESTINATION_TYPE.QUEUE);\n }\n\n if (isVoice) {\n destinations.consult.push(CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER);\n destinations.transfer.push(CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER);\n\n if (destinationConfig.accessEntryPoint?.toUpperCase() !== COLLABORATION_ACCESS.NONE) {\n destinations.consult.push(CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT);\n destinations.transfer.push(CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT);\n }\n }\n\n return destinations;\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\n/** True when this agent is actively initiating a consult, not a stale context flag alone (CAI-8329). */\nfunction isSelfActiveConsultInitiator(\n consultInitiator: boolean,\n selfAgentId: string | undefined,\n selfParticipant: {consultState?: string} | null | undefined,\n selfInConsultCall: boolean,\n consultingAgentId?: string\n): boolean {\n return (\n consultInitiator &&\n (selfParticipant?.consultState === 'consultInitiated' ||\n selfParticipant?.consultState === 'consulting' ||\n selfInConsultCall ||\n (Boolean(consultingAgentId) && consultingAgentId === selfAgentId))\n );\n}\n\nfunction computeVoiceInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData,\n currentLeg: TaskUILeg = 'main'\n): InteractionUIControls {\n // Early exit for idle\n if (state === TaskState.IDLE) {\n return getDefaultInteractionUIControls();\n }\n\n // 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 enableWxBetterTogether = config.enableWxBetterTogether ?? false;\n const wxAppDeviceDetails = enableWxBetterTogether\n ? getWebexCallingDeviceDetailsForAgent(selfAgentId, interaction?.participants)\n : undefined;\n const isWxAppParticipant = enableWxBetterTogether && wxAppDeviceDetails?.deviceType === 'wxApp';\n const isWxAppOffer =\n isWxAppParticipant && Boolean(wxAppDeviceDetails) && state === TaskState.OFFERED;\n const isWxAppInboundOffer = isWxAppOffer && !isOutdial;\n const isWxAppOutdialOffer = isWxAppOffer && isOutdial;\n const wxAppAnswerPending = config.wxAppAnswerPending ?? false;\n const wxAppAcceptInFlight = config.wxAppAcceptInFlight ?? false;\n const isWxAppEngaged = isWxAppEngagedForControls(\n enableWxBetterTogether,\n selfAgentId,\n interaction?.participants,\n state\n );\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 hideBlindTransferForEpDnPendingMerge,\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 isSecondaryConsultRejectedWhileEpDnActive =\n taskData?.type === 'AgentConsultFailed' && hideBlindTransferForEpDnPendingMerge;\n const isSelfConsultCompleted =\n selfParticipant?.consultState === 'consultCompleted' && taskData?.isConsulted === false;\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n (taskData?.type === 'AgentConsultFailed' && !isSecondaryConsultRejectedWhileEpDnActive) ||\n isSelfConsultCompleted;\n // EP-DN consult merged to conference before destination joins main (CAI-8329).\n // Context flag is set in actions.ts; treat as main-leg conference UI only here.\n const isEpDnPendingConferenceMergeUi =\n hideBlindTransferForEpDnPendingMerge &&\n participantCount <= 1 &&\n (isConferencing ||\n conferenceFromBackend ||\n interaction?.state === INTERACTION_STATE.POST_CALL) &&\n !isConsultEndedForSelf;\n const isEpDnPostCallCustomerLeft = isEpDnPendingConferenceMergeUi && !customerPresent;\n const effectiveConsultInProgress = isEpDnPendingConferenceMergeUi ? false : consultInProgress;\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 selfActiveConsultInitiator = isSelfActiveConsultInitiator(\n effectiveConsultInitiator,\n selfAgentId,\n selfParticipant,\n selfInConsultCall,\n taskData?.consultingAgentId\n );\n const consultOwnedBySelf = !isEpDnPendingConferenceMergeUi && selfActiveConsultInitiator;\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 (String(participant.pType ?? '').toUpperCase() !== '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 (effectiveConsultInProgress || effectiveConsultCallHeld || hasConsultMedia);\n const activeLegForConferenceConsult = effectiveConsultCallHeld ? 'main' : 'consult';\n const isCurrentLegActive = currentLeg === activeLegForConferenceConsult;\n const isConferenceConsultTransferContext =\n inConference && selfActiveConsultInitiator && 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 effectiveConsultInProgress ||\n isConsulting);\n const hideExitConferenceDuringActiveConsultFromConference =\n inConference &&\n selfActiveConsultInitiator &&\n consultDestinationAgentJoined &&\n (isConsulting ||\n taskData?.type === 'AgentConsulting' ||\n selfParticipant?.consultState === 'consulting');\n const hideExitConferenceOnMainLegForEpDnConsultFromConference =\n currentLeg === 'main' &&\n inConference &&\n consultFromConference &&\n selfActiveConsultInitiator &&\n (isConsulting ||\n effectiveConsultInProgress ||\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 && effectiveConsultInProgress && !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 // EP-DN consult merged to conference before a second agent joins main: hide blind transfer (CAI-8329).\n const shouldHideBlindTransferForEpDnPendingConferenceMerge = isEpDnPendingConferenceMergeUi;\n\n if (isConsultUnansweredFailure) {\n const recordingControl =\n recordingControlsAvailable && config.isRecordingEnabled && !inConference\n ? VISIBLE_ENABLED\n : DISABLED;\n\n return withWxAppTelephonyControls(\n {\n ...getDefaultInteractionUIControls(),\n hold: VISIBLE_ENABLED,\n transfer: VISIBLE_ENABLED,\n consult: VISIBLE_ENABLED,\n recording: recordingControl,\n end: VISIBLE_DISABLED,\n },\n isWxAppEngaged,\n currentLeg,\n isWrappingUp\n );\n }\n\n if (isConsultRequestedPhase && !isEpDnPendingConferenceMergeUi) {\n if (currentLeg === 'main') {\n return withWxAppTelephonyControls(\n {\n ...getDefaultInteractionUIControls(),\n transfer: shouldHideBlindTransferForEpDnPendingConferenceMerge\n ? DISABLED\n : VISIBLE_DISABLED,\n conference: VISIBLE_DISABLED,\n end: VISIBLE_DISABLED,\n },\n isWxAppEngaged,\n currentLeg,\n isWrappingUp\n );\n }\n\n if (currentLeg === 'consult') {\n return withWxAppTelephonyControls(\n {\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 isWxAppEngaged,\n currentLeg,\n isWrappingUp\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 if (isWxAppInboundOffer) {\n return wxAppAcceptInFlight || wxAppAnswerPending ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (isWxAppOutdialOffer) {\n return wxAppAcceptInFlight || wxAppAnswerPending ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n }\n if (state === TaskState.OFFERED && !interaction?.isTerminated) {\n return {isVisible: true, isEnabled: isWebrtc && !isOutdial};\n }\n\n return DISABLED;\n })(),\n decline: (() => {\n if (wxAppAcceptInFlight) return VISIBLE_DISABLED;\n if (wxAppAnswerPending && isWxAppInboundOffer) return VISIBLE_DISABLED;\n if (isWxAppInboundOffer) return VISIBLE_ENABLED;\n if (isWxAppOutdialOffer) return VISIBLE_ENABLED;\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 (isEpDnPostCallCustomerLeft) return VISIBLE_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 or wxApp engaged calls; hidden entirely during wrapup\n mute: (() => {\n if (isWxAppEngaged && !isWrappingUp) {\n return currentLeg === 'main' ? VISIBLE_ENABLED : DISABLED;\n }\n if (!isWebrtc) return DISABLED;\n if (isWrappingUp) return DISABLED;\n if (isEpDnPostCallCustomerLeft && inConference) return VISIBLE_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 (effectiveConsultInProgress) 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 (shouldHideBlindTransferForEpDnPendingConferenceMerge) 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 // EP-DN consult merged before destination joins: hide blind transfer on main\n // (Agent 2 may still be ringing on the consult leg — blind transfer causes stuck ringing)\n if (shouldHideBlindTransferForEpDnPendingConferenceMerge) {\n return DISABLED;\n }\n\n if (participantCount > 1) {\n return DISABLED;\n }\n\n return customerPresent ? VISIBLE_ENABLED : DISABLED;\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 !effectiveConsultInProgress &&\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 && !effectiveConsultInProgress && !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/conference when backend exposes recording controls\n recording: (() => {\n if (!recordingControlsAvailable || !config.isRecordingEnabled) return DISABLED;\n if (!hasFullControls || isConsulting) return DISABLED;\n if (inConference) {\n // Recording stays available in conference when backend exposes controls\n // (including after EP-DN pending merge transitions to real conference — CAI-8329)\n if (isEpDnPostCallCustomerLeft) return VISIBLE_DISABLED;\n\n return 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 (isEpDnPendingConferenceMergeUi) return VISIBLE_ENABLED;\n if (participantCount <= 1) return DISABLED;\n if (effectiveConsultInProgress) 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 && selfActiveConsultInitiator && hasConsultMedia;\n const selfConsultingOnParticipantState = selfParticipant?.consultState === 'consulting';\n const conferenceTransferAvailable =\n consultLegTransferAvailable ||\n (inConference &&\n selfActiveConsultInitiator &&\n hasConsultMedia &&\n (isConsulting || effectiveConsultInProgress || selfConsultingOnParticipantState));\n if (consultLegOnHold) return DISABLED;\n if (hasParallelConsultLeg && !conferenceTransferAvailable) return DISABLED;\n if (!conferenceTransferAvailable && (!inConference || !isConsulting)) return DISABLED;\n if (!selfActiveConsultInitiator || 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 keypad: (() => {\n if (isWxAppEngaged && !isWrappingUp) {\n return currentLeg === 'main' ? VISIBLE_ENABLED : 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 keypad: 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\n if (context.hideBlindTransferForEpDnPendingMerge && taskData) {\n const conferenceFromBackend = getIsConferenceInProgress(taskData);\n const participantCount =\n interaction && mainCallId ? getConferenceParticipantsCount(interaction, mainCallId) : 0;\n\n if (\n participantCount <= 1 &&\n (currentState === TaskState.CONFERENCING || conferenceFromBackend)\n ) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: TaskState.CONFERENCING,\n consultState: TaskState.CONSULTING,\n };\n }\n }\n\n const selfParticipant = selfAgentId ? interaction?.participants?.[selfAgentId] : null;\n const hasConsultMedia = hasConsultMediaInInteraction(\n interaction,\n taskData?.consultMediaResourceId\n );\n const isSecondaryConsultRejectedWhileEpDnActive =\n taskData?.type === 'AgentConsultFailed' && context.hideBlindTransferForEpDnPendingMerge;\n const isSelfConsultCompleted =\n selfParticipant?.consultState === 'consultCompleted' && taskData?.isConsulted === false;\n const isConsultEndedForSelf =\n taskData?.type === 'AgentConsultEnded' ||\n (taskData?.type === 'AgentConsultFailed' && !isSecondaryConsultRejectedWhileEpDnActive) ||\n isSelfConsultCompleted;\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 consultMedia = Object.values(interaction?.media ?? {}).find(\n (media: any) =>\n media?.mediaResourceId === taskData?.consultMediaResourceId || media?.mType === 'consult'\n ) as {participants?: string[]} | undefined;\n const selfInConsultCall =\n Boolean(selfAgentId) && Boolean(consultMedia?.participants?.includes(selfAgentId as string));\n const selfActiveConsultInitiator = isSelfActiveConsultInitiator(\n context.consultInitiator,\n selfAgentId,\n selfParticipant,\n selfInConsultCall,\n taskData?.consultingAgentId\n );\n const consultOwnedBySelf =\n !context.hideBlindTransferForEpDnPendingMerge && selfActiveConsultInitiator;\n const selfConsultPendingOnConsultMedia =\n selfParticipant?.consultState === 'consultInitiated' &&\n !taskData?.isConsulted &&\n hasConsultMedia;\n const selfConsultingOnConsultMedia =\n selfParticipant?.consultState === 'consulting' && hasConsultMedia;\n const isConsultUnansweredFailure =\n isSelfConsultCompleted &&\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 const mainMediaId = taskData?.interaction?.mainInteractionId || taskData?.interactionId;\n const isMainHeld = Boolean(\n mainMediaId && taskData?.interaction?.media?.[mainMediaId]?.isHold === true\n );\n mainState =\n isMainHeld || taskData?.interaction?.state === 'hold' ? TaskState.HELD : TaskState.CONNECTED;\n } else if (currentState === TaskState.CONNECTED || currentState === TaskState.HELD) {\n mainState = currentState;\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 const consultTransferDestinations = getConsultTransferDestinations(\n context.uiControlConfig,\n fallbackTaskData ?? context.taskData\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(\n mainControls,\n consultControls,\n activeLeg,\n consultTransferDestinations\n );\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main',\n consultTransferDestinations\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\nfunction haveDestinationListChanged(\n previous: DestinationControls['consult'],\n next: DestinationControls['consult']\n): boolean {\n return (\n previous.length !== next.length ||\n previous.some((destination, index) => destination !== next[index])\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 haveDestinationListChanged(\n previous.consultTransferDestinations.consult,\n next.consultTransferDestinations.consult\n ) ||\n haveDestinationListChanged(\n previous.consultTransferDestinations.transfer,\n next.consultTransferDestinations.transfer\n ) ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":";;;;;;;;AAIA,IAAAA,MAAA,GAAAC,OAAA;AAUA,IAAAC,kBAAA,GAAAD,OAAA;AAIA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AAQA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AA5BA;AACA;AACA;;AA8BA,MAAMM,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;AACA,SAASG,0BAA0BA,CACjCC,QAA+B,EAC/BC,cAAuB,EACvBC,UAAqB,EACrBC,YAAqB,EACE;EACvB,IAAI,CAACF,cAAc,IAAIE,YAAY,EAAE;IACnC,OAAOH,QAAQ;EACjB;EAEA,IAAIE,UAAU,KAAK,MAAM,EAAE;IACzB,OAAO;MACL,GAAGF,QAAQ;MACXI,IAAI,EAAEP,eAAe;MACrBQ,MAAM,EAAER;IACV,CAAC;EACH;EAEA,OAAO;IACL,GAAGG,QAAQ;IACXI,IAAI,EAAEV,QAAQ;IACdW,MAAM,EAAEX;EACV,CAAC;AACH;AAEA,SAASY,+BAA+BA,CAAA,EAA0B;EAChE,OAAO;IACLC,MAAM,EAAEb,QAAQ;IAChBc,OAAO,EAAEd,QAAQ;IACjBe,IAAI,EAAEf,QAAQ;IACdU,IAAI,EAAEV,QAAQ;IACdgB,GAAG,EAAEhB,QAAQ;IACbiB,QAAQ,EAAEjB,QAAQ;IAClBkB,OAAO,EAAElB,QAAQ;IACjBmB,eAAe,EAAEnB,QAAQ;IACzBoB,UAAU,EAAEpB,QAAQ;IACpBqB,SAAS,EAAErB,QAAQ;IACnBsB,UAAU,EAAEtB,QAAQ;IACpBuB,MAAM,EAAEvB,QAAQ;IAChBwB,cAAc,EAAExB,QAAQ;IACxByB,kBAAkB,EAAEzB,QAAQ;IAC5B0B,iBAAiB,EAAE1B,QAAQ;IAC3B2B,MAAM,EAAE3B,QAAQ;IAChBW,MAAM,EAAEX;EACV,CAAC;AACH;AAEA,SAAS4B,oBAAoBA,CAC3BC,IAA2B,EAC3BX,OAA8B,EAC9BY,SAAoB,EACpBC,2BAAgD,GAAG;EACjDb,OAAO,EAAE,EAAE;EACXD,QAAQ,EAAE;AACZ,CAAC,EACe;EAChB,OAAO;IACLY,IAAI;IACJX,OAAO;IACPY,SAAS;IACTC;EACF,CAAC;AACH;AAEO,SAASC,oBAAoBA,CAAA,EAAmB;EACrD,OAAOJ,oBAAoB,CACzBhB,+BAA+B,CAAC,CAAC,EACjCA,+BAA+B,CAAC,CAAC,EACjC,MACF,CAAC;AACH;AAEA,SAASqB,8BAA8BA,CACrCC,MAAuB,EACvBC,QAA0B,EACL;EACrB,MAAMC,iBAAiB,GAAGF,MAAM,CAACG,qBAAqB;EACtD,IAAI,CAACD,iBAAiB,EAAE;IACtB,OAAO;MAAClB,OAAO,EAAE,EAAE;MAAED,QAAQ,EAAE;IAAE,CAAC;EACpC;EAEA,MAAMqB,OAAO,GAAGJ,MAAM,CAACK,WAAW,KAAKC,wBAAiB,CAACC,KAAK;EAC9D,MAAMC,WAAW,GAAGP,QAAQ,EAAEO,WAAW;EACzC,MAAMC,SAAS,GAAGD,WAAW,EAAEE,gBAAgB,EAAEC,IAAI,EAAEC,WAAW,CAAC,CAAC;EACpE,MAAMC,YAAiC,GAAG;IACxC7B,OAAO,EAAE,EAAE;IACXD,QAAQ,EAAE;EACZ,CAAC;EAED,IAAImB,iBAAiB,CAACY,eAAe,EAAEF,WAAW,CAAC,CAAC,KAAKG,gCAAoB,CAACC,IAAI,EAAE;IAClFH,YAAY,CAAC7B,OAAO,CAACiC,IAAI,CAACC,wCAAiC,CAACC,KAAK,CAAC;IAClEN,YAAY,CAAC9B,QAAQ,CAACkC,IAAI,CAACC,wCAAiC,CAACC,KAAK,CAAC;EACrE;EAEA,IAAIjB,iBAAiB,CAACkB,WAAW,EAAER,WAAW,CAAC,CAAC,KAAKG,gCAAoB,CAACC,IAAI,EAAE;IAC9E,MAAMK,eAAe,GAAG,CAACjB,OAAO,IAAIF,iBAAiB,CAACoB,mBAAmB;IACzE,MAAMC,gBAAgB,GACpB,CAACnB,OAAO,IACRK,SAAS,KAAKe,6BAAiB,IAC9Bf,SAAS,KAAKgB,6BAAiB,IAC9BjB,WAAW,EAAEkB,qBAAqB,EAAEC,6BAA6B,KAAK,IAAK;IAE/E,IAAIN,eAAe,EAAER,YAAY,CAAC7B,OAAO,CAACiC,IAAI,CAACC,wCAAiC,CAACU,KAAK,CAAC;IACvF,IAAIL,gBAAgB,EAAEV,YAAY,CAAC9B,QAAQ,CAACkC,IAAI,CAACC,wCAAiC,CAACU,KAAK,CAAC;EAC3F;EAEA,IAAIxB,OAAO,EAAE;IACXS,YAAY,CAAC7B,OAAO,CAACiC,IAAI,CAACC,wCAAiC,CAACW,UAAU,CAAC;IACvEhB,YAAY,CAAC9B,QAAQ,CAACkC,IAAI,CAACC,wCAAiC,CAACW,UAAU,CAAC;IAExE,IAAI3B,iBAAiB,CAAC4B,gBAAgB,EAAElB,WAAW,CAAC,CAAC,KAAKG,gCAAoB,CAACC,IAAI,EAAE;MACnFH,YAAY,CAAC7B,OAAO,CAACiC,IAAI,CAACC,wCAAiC,CAACa,UAAU,CAAC;MACvElB,YAAY,CAAC9B,QAAQ,CAACkC,IAAI,CAACC,wCAAiC,CAACa,UAAU,CAAC;IAC1E;EACF;EAEA,OAAOlB,YAAY;AACrB;;AAEA;AACA,SAASmB,4BAA4BA,CACnCxB,WAAgD,EAChDyB,sBAA+B,EACtB;EACT,MAAMC,KAAK,GAAG1B,WAAW,EAAE0B,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;AACA,SAASS,4BAA4BA,CACnCC,gBAAyB,EACzBC,WAA+B,EAC/BC,eAA2D,EAC3DC,iBAA0B,EAC1BC,iBAA0B,EACjB;EACT,OACEJ,gBAAgB,KACfE,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACnDH,eAAe,EAAEG,YAAY,KAAK,YAAY,IAC9CF,iBAAiB,IAChBL,OAAO,CAACM,iBAAiB,CAAC,IAAIA,iBAAiB,KAAKH,WAAY,CAAC;AAExE;AAEA,SAASK,iCAAiCA,CACxCC,KAAgB,EAChBC,OAAoB,EACpBnD,MAAuB,EACvBoD,gBAA2B,EAC3B9E,UAAqB,GAAG,MAAM,EACP;EACvB;EACA,IAAI4E,KAAK,KAAKG,oBAAS,CAACC,IAAI,EAAE;IAC5B,OAAO5E,+BAA+B,CAAC,CAAC;EAC1C;;EAEA;EACA,MAAMuB,QAAQ,GAAGmD,gBAAgB,IAAID,OAAO,CAAClD,QAAQ,IAAI,IAAI;EAC7D,MAAMO,WAAW,GAAGP,QAAQ,EAAEO,WAAW;EACzC,MAAM+C,UAAU,GAAG/C,WAAW,EAAEgD,iBAAiB,IAAIvD,QAAQ,EAAEwD,aAAa;EAC5E,MAAMC,QAAQ,GAAG1D,MAAM,CAAC2D,YAAY,KAAKC,oBAAa,CAACC,MAAM;EAC7D,MAAMC,SAAS,GAAGtD,WAAW,EAAEuD,YAAY,KAAK,SAAS;EACzD,MAAMC,UAAU,GAAG,IAAAC,wCAA6B,EAACd,OAAO,EAAEI,UAAU,EAAEH,gBAAgB,CAAC;;EAEvF;EACA,MAAMc,cAAc,GAClB1D,WAAW,IAAI+C,UAAU,GAAG,IAAAY,8BAAmB,EAAC3D,WAAW,EAAE+C,UAAU,CAAC,GAAG,KAAK;EAClF;EACA,MAAMa,eAAe,GACnBF,cAAc,IACdzB,OAAO,CACLjC,WAAW,IACTA,WAAW,CAAC6D,YAAY,IACxBjC,MAAM,CAACC,MAAM,CAAC7B,WAAW,CAAC6D,YAAY,CAAC,CAAC/B,IAAI,CACzCgC,CAAM,IAAKA,CAAC,EAAEC,KAAK,KAAK,UAAU,IAAI,CAACD,CAAC,EAAEE,OAC7C,CACJ,CAAC;EACH,MAAMC,gBAAgB,GACpBjE,WAAW,IAAI+C,UAAU,GAAG,IAAAmB,yCAA8B,EAAClE,WAAW,EAAE+C,UAAU,CAAC,GAAG,CAAC;EACzF,MAAMoB,eAAe,GAAGF,gBAAgB,IAAIG,oDAAyC;EACrF,MAAMhC,WAAW,GAAG5C,MAAM,CAAC6E,OAAO,IAAI5E,QAAQ,EAAE4E,OAAO;EACvD,MAAMC,sBAAsB,GAAG9E,MAAM,CAAC8E,sBAAsB,IAAI,KAAK;EACrE,MAAMC,kBAAkB,GAAGD,sBAAsB,GAC7C,IAAAE,uDAAoC,EAACpC,WAAW,EAAEpC,WAAW,EAAE6D,YAAY,CAAC,GAC5EY,SAAS;EACb,MAAMC,kBAAkB,GAAGJ,sBAAsB,IAAIC,kBAAkB,EAAEI,UAAU,KAAK,OAAO;EAC/F,MAAMC,YAAY,GAChBF,kBAAkB,IAAIzC,OAAO,CAACsC,kBAAkB,CAAC,IAAI7B,KAAK,KAAKG,oBAAS,CAACgC,OAAO;EAClF,MAAMC,mBAAmB,GAAGF,YAAY,IAAI,CAACtB,SAAS;EACtD,MAAMyB,mBAAmB,GAAGH,YAAY,IAAItB,SAAS;EACrD,MAAM0B,kBAAkB,GAAGxF,MAAM,CAACwF,kBAAkB,IAAI,KAAK;EAC7D,MAAMC,mBAAmB,GAAGzF,MAAM,CAACyF,mBAAmB,IAAI,KAAK;EAC/D,MAAMpH,cAAc,GAAG,IAAAqH,4CAAyB,EAC9CZ,sBAAsB,EACtBlC,WAAW,EACXpC,WAAW,EAAE6D,YAAY,EACzBnB,KACF,CAAC;EACD,MAAMyC,iBAAiB,GAAG,IAAAC,sDAA2C,EACnEpF,WAAW,EACX+C,UAAU,EACVX,WACF,CAAC;EACD,MAAMiD,qBAAqB,GAAG5F,QAAQ,GAAG,IAAA6F,oCAAyB,EAAC7F,QAAQ,CAAC,GAAG,KAAK;EACpF;;EAEA;EACA,MAAM;IACJ0C,gBAAgB;IAChBoD,6BAA6B;IAC7BC,sBAAsB;IACtBC,eAAe;IACfC,qBAAqB;IACrBC;EACF,CAAC,GAAGhD,OAAO;EACX,MAAM;IAACiD;EAA0B,CAAC,GAAGjD,OAAO;;EAE5C;EACA;EACA,MAAMkD,aAAa,GACjBL,sBAAsB,KAAK,YAAY,IAAIA,sBAAsB,KAAM,OAAe;EAExF,MAAMM,gBAAgB,GAAGpD,KAAK,KAAKG,oBAAS,CAACkD,IAAI,IAAIrD,KAAK,KAAKG,oBAAS,CAACmD,iBAAiB;EAC1F,MAAMC,qBAAqB,GACzBvD,KAAK,KAAKG,oBAAS,CAACqD,SAAS,IAAIxD,KAAK,KAAKG,oBAAS,CAACsD,eAAe;EACtE,MAAMC,MAAM,GAAGN,gBAAgB,IAAItC,UAAU,KAAK,IAAI;EACtD,MAAM6C,WAAW,GAAGJ,qBAAqB,IAAK,CAACH,gBAAgB,IAAItC,UAAU,KAAK,KAAM;;EAExF;EACA,MAAM8C,YAAY,GAChB5D,KAAK,KAAKG,oBAAS,CAAC0D,UAAU,IAC9B7D,KAAK,KAAKG,oBAAS,CAAC2D,kBAAkB,IACtC9D,KAAK,KAAKG,oBAAS,CAAC4D,eAAe;EACrC,MAAMC,cAAc,GAAGhE,KAAK,KAAKG,oBAAS,CAAC8D,YAAY;EACvD,MAAM5I,YAAY,GAAG2E,KAAK,KAAKG,oBAAS,CAAC+D,WAAW;EACpD,MAAMC,cAAc,GAClB5E,OAAO,CAACG,WAAW,CAAC,IACpBH,OAAO,CAACc,UAAU,CAAC,IACnBd,OAAO,CAACjC,WAAW,EAAE0B,KAAK,GAAGqB,UAAU,CAAC,EAAEc,YAAY,EAAEiD,QAAQ,CAAC1E,WAAqB,CAAC,CAAC;EAC1F,MAAM2E,YAAY,GAAGnF,MAAM,CAACC,MAAM,CAAC7B,WAAW,EAAE0B,KAAK,IAAI,CAAC,CAAC,CAAC,CAACsF,IAAI,CAC9DtF,KAAU,IACTA,KAAK,EAAEuF,eAAe,KAAKxH,QAAQ,EAAEgC,sBAAsB,IAAIC,KAAK,EAAEM,KAAK,KAAK,SACpF,CAA0C;EAC1C,MAAMK,eAAe,GAAGD,WAAW,GAAGpC,WAAW,EAAE6D,YAAY,GAAGzB,WAAW,CAAC,GAAG,IAAI;EACrF,MAAME,iBAAiB,GACrBL,OAAO,CAACG,WAAW,CAAC,IAAIH,OAAO,CAAC8E,YAAY,EAAElD,YAAY,EAAEiD,QAAQ,CAAC1E,WAAqB,CAAC,CAAC;EAC9F,MAAM8E,eAAe,GAAG1F,4BAA4B,CAClDxB,WAAW,EACXP,QAAQ,EAAEgC,sBACZ,CAAC;EACD,MAAM0F,yCAAyC,GAC7C1H,QAAQ,EAAEU,IAAI,KAAK,oBAAoB,IAAIwF,oCAAoC;EACjF,MAAMyB,sBAAsB,GAC1B/E,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IAAI/C,QAAQ,EAAE4H,WAAW,KAAK,KAAK;EACzF,MAAMC,qBAAqB,GACzB7H,QAAQ,EAAEU,IAAI,KAAK,mBAAmB,IACrCV,QAAQ,EAAEU,IAAI,KAAK,oBAAoB,IAAI,CAACgH,yCAA0C,IACvFC,sBAAsB;EACxB;EACA;EACA,MAAMG,8BAA8B,GAClC5B,oCAAoC,IACpC1B,gBAAgB,IAAI,CAAC,KACpByC,cAAc,IACbrB,qBAAqB,IACrBrF,WAAW,EAAE0C,KAAK,KAAK8E,4BAAiB,CAACC,SAAS,CAAC,IACrD,CAACH,qBAAqB;EACxB,MAAMI,0BAA0B,GAAGH,8BAA8B,IAAI,CAAC3D,eAAe;EACrF,MAAM+D,0BAA0B,GAAGJ,8BAA8B,GAAG,KAAK,GAAGpC,iBAAiB;EAC7F,MAAMyC,yBAAyB,GAAGN,qBAAqB,GAAG,KAAK,GAAGnF,gBAAgB;EAClF,MAAM0F,wBAAwB,GAAGP,qBAAqB,GAAG,KAAK,GAAG7B,eAAe;EAChF,MAAMqC,8BAA8B,GAAGR,qBAAqB,GAAG,KAAK,GAAG5B,qBAAqB;EAC5F,MAAMqC,sCAAsC,GAAGT,qBAAqB,GAChE,KAAK,GACL/B,6BAA6B;EACjC;EACA;EACA;EACA,MAAMyC,wBAAwB,GAAGV,qBAAqB,GAAG,KAAK,GAAGJ,eAAe;EAChF,MAAMe,yBAAyB,GAAGF,sCAAsC,IAAIlC,aAAa;EACzF,MAAMqC,gBAAgB,GACpBxB,cAAc,IAAIrB,qBAAqB,IAAIyC,8BAA8B;EAC3E;EACA,MAAMK,YAAY,GAChBD,gBAAgB,KAAKxB,cAAc,IAAIG,cAAc,IAAIe,yBAAyB,CAAC;;EAErF;EACA,MAAMQ,iBAAiB,GACrBnE,gBAAgB,IAAI,CAAC,IAAI4C,cAAc,IAAI,CAACP,YAAY,IAAI,CAAC6B,YAAY;EAC3E,MAAMd,WAAW,GACfc,YAAY,IAAIC,iBAAiB,GAC7B,KAAK,GACL,IAAAC,yCAA8B,EAAC5I,QAAQ,EAAEkD,OAAO,EAAE2D,YAAY,CAAC,IAC9D,CAACsB,yBAAyB,KACxBvF,eAAe,EAAEgF,WAAW,KAAK,IAAI,IACpChF,eAAe,EAAEG,YAAY,KAAK,YAAY,CAAE;;EAE1D;EACA,MAAM8F,QAAQ,GACZ5F,KAAK,KAAKG,oBAAS,CAACqD,SAAS,IAC7BxD,KAAK,KAAKG,oBAAS,CAACkD,IAAI,IACxBrD,KAAK,KAAKG,oBAAS,CAACsD,eAAe,IACnCzD,KAAK,KAAKG,oBAAS,CAACmD,iBAAiB,IACrCM,YAAY,IACZI,cAAc;;EAEhB;EACA;EACA,MAAM6B,eAAe,GAAG,CAAClB,WAAW,IAAIO,yBAAyB,IAAIO,YAAY,IAAIpK,YAAY;EACjG,MAAMyK,0BAA0B,GAAGtG,4BAA4B,CAC7D0F,yBAAyB,EACzBxF,WAAW,EACXC,eAAe,EACfC,iBAAiB,EACjB7C,QAAQ,EAAE8C,iBACZ,CAAC;EACD,MAAMkG,kBAAkB,GAAG,CAAClB,8BAA8B,IAAIiB,0BAA0B;EACxF,MAAME,gCAAgC,GACpCrG,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACpD,CAAC/C,QAAQ,EAAE4H,WAAW,IACtBH,eAAe;EACjB,MAAMyB,gBAAgB,GAAG3I,WAAW,EAAE4I,KAAK,GACvC5I,WAAW,CAAC6D,YAAY,GAAG7D,WAAW,CAAC4I,KAAK,CAAC,GAC7CnE,SAAS;EACb,MAAMoE,2BAA2B,GAAG5G,OAAO,CACzCjC,WAAW,EAAE6D,YAAY,IACvBjC,MAAM,CAACC,MAAM,CAAC7B,WAAW,CAAC6D,YAAY,CAAC,CAAC/B,IAAI,CAAEgH,WAAgB,IAAK;IACjE,IAAI,CAACA,WAAW,IAAIA,WAAW,CAAC9E,OAAO,EAAE,OAAO,KAAK;IACrD,IAAI8E,WAAW,CAACC,EAAE,KAAK3G,WAAW,EAAE,OAAO,KAAK;IAChD,IAAI4G,MAAM,CAACF,WAAW,CAAC/E,KAAK,IAAI,EAAE,CAAC,CAAC3D,WAAW,CAAC,CAAC,KAAK,OAAO,EAAE,OAAO,KAAK;IAE3E,OACE0I,WAAW,CAACtG,YAAY,KAAK,kBAAkB,IAC/CsG,WAAW,CAACtG,YAAY,KAAK,iBAAiB,IAC9CsG,WAAW,CAACtG,YAAY,KAAK,YAAY,IACzCsG,WAAW,CAACG,YAAY,KAAK,YAAY;EAE7C,CAAC,CACL,CAAC;EACD,MAAMC,kCAAkC,GACtCf,YAAY,IAAIO,gCAAgC,IAAI,CAACX,sCAAsC;EAC7F,MAAMoB,qBAAqB,GACzB,CAAC7B,qBAAqB,IACtBmB,kBAAkB,IAClB,CAACnC,YAAY,IACb,CAACe,WAAW,KACXM,0BAA0B,IAAIE,wBAAwB,IAAIX,eAAe,CAAC;EAC7E,MAAMkC,6BAA6B,GAAGvB,wBAAwB,GAAG,MAAM,GAAG,SAAS;EACnF,MAAMwB,kBAAkB,GAAGvL,UAAU,KAAKsL,6BAA6B;EACvE,MAAME,kCAAkC,GACtCnB,YAAY,IAAIK,0BAA0B,IAAItB,eAAe,IAAIe,yBAAyB;EAC5F,MAAMsB,gBAAgB,GAAGjD,YAAY,IAAIuB,wBAAwB;EACjE,MAAM3G,qBAAqB,GAAGlB,WAAW,EAAEkB,qBAE9B;EACb,MAAMsI,yBAAyB,GAC7BtI,qBAAqB,EAAEsI,yBAAyB,KAAK,IAAI,IACzDtI,qBAAqB,EAAEsI,yBAAyB,KAAK,MAAM;EAC7D,MAAMC,sBAAsB,GAC1BtH,gBAAgB,IAChB,CAACoD,6BAA6B,IAC9Ba,MAAM,IACN+B,YAAY,IACZqB,yBAAyB;EAC3B,MAAME,+BAA+B,GACnCrH,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IAAI4D,MAAM,IAAI+B,YAAY,IAAI,CAAC7B,YAAY;EACjG,MAAMqD,uCAAuC,GAC3CvD,MAAM,IACN+B,YAAY,IACZ,CAAC7B,YAAY,IACb,CAACnE,gBAAgB,IACjBF,OAAO,CAACG,WAAW,CAAC,IACpBH,OAAO,CAACjC,WAAW,EAAE4I,KAAK,CAAC,IAC3BxG,WAAW,KAAKpC,WAAW,EAAE4I,KAAK,IAClCD,gBAAgB,EAAEnG,YAAY,KAAK,kBAAkB;EACvD,MAAMoH,0BAA0B,GAC9BvH,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IAAI,CAAC+C,6BAA6B;EACxF,MAAMsE,qCAAqC,GACzC/L,UAAU,KAAK,MAAM,IACrBqK,YAAY,IACZyB,0BAA0B,KACzBlE,qBAAqB,IACpBvD,gBAAgB,IAChB1C,QAAQ,EAAEU,IAAI,KAAK,qBAAqB,IACxCwH,0BAA0B,IAC1BrB,YAAY,CAAC;EACjB,MAAMwD,mDAAmD,GACvD3B,YAAY,IACZK,0BAA0B,IAC1BjD,6BAA6B,KAC5Be,YAAY,IACX7G,QAAQ,EAAEU,IAAI,KAAK,iBAAiB,IACpCkC,eAAe,EAAEG,YAAY,KAAK,YAAY,CAAC;EACnD,MAAMuH,uDAAuD,GAC3DjM,UAAU,KAAK,MAAM,IACrBqK,YAAY,IACZzC,qBAAqB,IACrB8C,0BAA0B,KACzBlC,YAAY,IACXqB,0BAA0B,IAC1BlI,QAAQ,EAAEU,IAAI,KAAK,qBAAqB,IACxCV,QAAQ,EAAEU,IAAI,KAAK,iBAAiB,IACpCkC,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACpDH,eAAe,EAAEG,YAAY,KAAK,YAAY,CAAC;EACnD,MAAMwH,4BAA4B,GAChC,CAACH,qCAAqC,KACrCJ,sBAAsB,IAAIC,+BAA+B,CAAC;EAC7D,MAAMO,gBAAgB,GACpB5H,eAAe,EAAEG,YAAY,KAAK,YAAY,IAC9CH,eAAe,EAAE4G,YAAY,KAAK,YAAY;EAChD,MAAMiB,0CAA0C,GAC9CpM,UAAU,KAAK,MAAM,IAAIqK,YAAY,IAAIR,0BAA0B,IAAI,CAACsC,gBAAgB;EAC1F,MAAME,uCAAuC,GAC3CD,0CAA0C,IAAI,CAAChB,kCAAkC;EACnF,MAAMkB,uBAAuB,GAC3BR,0BAA0B,IAC1B,CAACvC,WAAW,KACXlF,gBAAgB,IACdF,OAAO,CAACG,WAAW,CAAC,IACnBC,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACpD/C,QAAQ,EAAE4E,OAAO,KAAKjC,WAAY,CAAC;EACzC,MAAMiI,0BAA0B,GAC9BvM,UAAU,KAAK,MAAM,IACrB,CAACqK,YAAY,IACb,CAAC1I,QAAQ,EAAE4H,WAAW,IACtB,CAACW,wBAAwB,IACzB5B,MAAM,IACN/D,eAAe,EAAEG,YAAY,KAAK,kBAAkB,KACnD/C,QAAQ,EAAEU,IAAI,KAAK,oBAAoB,IACtCV,QAAQ,EAAEU,IAAI,KAAK,mBAAmB,IACtCmH,qBAAqB,CAAC;EAC1B;EACA,MAAMgD,oDAAoD,GAAG/C,8BAA8B;EAE3F,IAAI8C,0BAA0B,EAAE;IAC9B,MAAME,gBAAgB,GACpB3E,0BAA0B,IAAIpG,MAAM,CAACgL,kBAAkB,IAAI,CAACrC,YAAY,GACpE1K,eAAe,GACfH,QAAQ;IAEd,OAAOK,0BAA0B,CAC/B;MACE,GAAGO,+BAA+B,CAAC,CAAC;MACpCG,IAAI,EAAEZ,eAAe;MACrBc,QAAQ,EAAEd,eAAe;MACzBe,OAAO,EAAEf,eAAe;MACxBkB,SAAS,EAAE4L,gBAAgB;MAC3BjM,GAAG,EAAEZ;IACP,CAAC,EACDG,cAAc,EACdC,UAAU,EACVC,YACF,CAAC;EACH;EAEA,IAAIqM,uBAAuB,IAAI,CAAC7C,8BAA8B,EAAE;IAC9D,IAAIzJ,UAAU,KAAK,MAAM,EAAE;MACzB,OAAOH,0BAA0B,CAC/B;QACE,GAAGO,+BAA+B,CAAC,CAAC;QACpCK,QAAQ,EAAE+L,oDAAoD,GAC1DhN,QAAQ,GACRI,gBAAgB;QACpBkB,UAAU,EAAElB,gBAAgB;QAC5BY,GAAG,EAAEZ;MACP,CAAC,EACDG,cAAc,EACdC,UAAU,EACVC,YACF,CAAC;IACH;IAEA,IAAID,UAAU,KAAK,SAAS,EAAE;MAC5B,OAAOH,0BAA0B,CAC/B;QACE,GAAGO,+BAA+B,CAAC,CAAC;QACpCQ,UAAU,EAAEjB,eAAe;QAC3BwB,MAAM,EAAEvB,gBAAgB;QACxBa,QAAQ,EAAEb,gBAAgB;QAC1BqB,kBAAkB,EAAEoJ,YAAY,GAAGzK,gBAAgB,GAAGJ,QAAQ;QAC9D0B,iBAAiB,EAAEtB;MACrB,CAAC,EACDG,cAAc,EACdC,UAAU,EACVC,YACF,CAAC;IACH;EACF;EAEA,OAAO;IACL;IACA;IACA;IACA;IACAI,MAAM,EAAE,CAAC,MAAM;MACb,IAAI2G,mBAAmB,EAAE;QACvB,OAAOG,mBAAmB,IAAID,kBAAkB,GAAGtH,gBAAgB,GAAGD,eAAe;MACvF;MACA,IAAIsH,mBAAmB,EAAE;QACvB,OAAOE,mBAAmB,IAAID,kBAAkB,GAAGtH,gBAAgB,GAAGD,eAAe;MACvF;MACA,IAAIiF,KAAK,KAAKG,oBAAS,CAACgC,OAAO,IAAI,CAAC7E,WAAW,EAAEyK,YAAY,EAAE;QAC7D,OAAO;UAAClN,SAAS,EAAE,IAAI;UAAEC,SAAS,EAAE0F,QAAQ,IAAI,CAACI;QAAS,CAAC;MAC7D;MAEA,OAAOhG,QAAQ;IACjB,CAAC,EAAE,CAAC;IACJc,OAAO,EAAE,CAAC,MAAM;MACd,IAAI6G,mBAAmB,EAAE,OAAOvH,gBAAgB;MAChD,IAAIsH,kBAAkB,IAAIF,mBAAmB,EAAE,OAAOpH,gBAAgB;MACtE,IAAIoH,mBAAmB,EAAE,OAAOrH,eAAe;MAC/C,IAAIsH,mBAAmB,EAAE,OAAOtH,eAAe;MAC/C,IAAI,CAACyF,QAAQ,IAAIR,KAAK,KAAKG,oBAAS,CAACgC,OAAO,IAAI7E,WAAW,EAAEyK,YAAY,EAAE,OAAOnN,QAAQ;MAE1F,OAAOgG,SAAS,GAAG5F,gBAAgB,GAAGD,eAAe;IACvD,CAAC,EAAE,CAAC;IAEJ;IACAY,IAAI,EAAE,CAAC,MAAM;MACX,IAAI,CAACkK,eAAe,EAAE,OAAOjL,QAAQ;MACrC,IAAIoK,0BAA0B,EAAE,OAAOhK,gBAAgB;MACvD,IAAIsM,4BAA4B,EAAE,OAAOvM,eAAe;MACxD,IACEgL,kBAAkB,KACjBnC,YAAY,IAAI6C,qBAAqB,IAAItB,wBAAwB,CAAC,EACnE;QACA,OAAOvK,QAAQ;MACjB;MACA,IAAI6L,qBAAqB,EAAE,OAAO7L,QAAQ;MAC1C,IAAIoF,KAAK,KAAKG,oBAAS,CAACgC,OAAO,EAAE,OAAOvH,QAAQ;MAChD,IAAIS,YAAY,EAAE,OAAOT,QAAQ;MACjC;MACA,IAAI,EAAE+I,WAAW,IAAID,MAAM,IAAI+B,YAAY,CAAC,EAAE,OAAO7K,QAAQ;MAC7D;MACA,MAAMoN,OAAO,GAAG,CAACrE,WAAW,IAAID,MAAM,KAAK,CAAC+B,YAAY,IAAI,CAAC7B,YAAY;MAEzE,OAAOoE,OAAO,GAAGjN,eAAe,GAAGC,gBAAgB;IACrD,CAAC,EAAE,CAAC;IAEJ;IACAM,IAAI,EAAE,CAAC,MAAM;MACX,IAAIH,cAAc,IAAI,CAACE,YAAY,EAAE;QACnC,OAAOD,UAAU,KAAK,MAAM,GAAGL,eAAe,GAAGH,QAAQ;MAC3D;MACA,IAAI,CAAC4F,QAAQ,EAAE,OAAO5F,QAAQ;MAC9B,IAAIS,YAAY,EAAE,OAAOT,QAAQ;MACjC,IAAIoK,0BAA0B,IAAIS,YAAY,EAAE,OAAOzK,gBAAgB;MACvE,IAAII,UAAU,KAAK,SAAS,IAAI,CAACwE,iBAAiB,EAAE,OAAOhF,QAAQ;MACnE;MACA;MACA;MACA,MAAMqN,wBAAwB,GAAGtD,WAAW,IAAIvJ,UAAU,KAAK,MAAM;MACrE,IACE,CAACwI,YAAY,IAAI6C,qBAAqB,KACtC,CAACE,kBAAkB,IACnB,CAACsB,wBAAwB,EACzB;QACA,OAAOjN,gBAAgB;MACzB;MACA,IAAI4I,YAAY,EAAE,OAAO7I,eAAe;MAExC,IAAI4I,WAAW,IAAID,MAAM,IAAIM,cAAc,EAAE;QAC3C,IAAIyB,YAAY,EAAE,OAAO1K,eAAe;QAExC,OAAO2I,MAAM,GAAG1I,gBAAgB,GAAGD,eAAe;MACpD;MAEA,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAgB,GAAG,EAAE,CAAC,MAAM;MACV,IAAI6L,uCAAuC,EAAE,OAAO1M,eAAe;MACnE,IAAIyM,0CAA0C,EAAE,OAAOxM,gBAAgB;MACvE,IAAIwL,kCAAkC,IAAIpL,UAAU,KAAK,MAAM,EAAE,OAAOJ,gBAAgB;MACxF,IAAI,CAAC8B,MAAM,CAACoL,gBAAgB,IAAI,CAAC1H,QAAQ,EAAE,OAAO5F,QAAQ;MAC1D,IAAI6L,qBAAqB,EAAE;QACzB,OAAO9C,WAAW,IAAIR,aAAa,GAAGpI,eAAe,GAAGC,gBAAgB;MAC1E;MAEA,IAAI4I,YAAY,EAAE;QAChB,IAAIxI,UAAU,KAAK,SAAS,IAAI2H,eAAe,EAAE,OAAOnI,QAAQ;QAEhE,OAAO6E,gBAAgB,IAAIsD,eAAe,GAAGhI,eAAe,GAAGH,QAAQ;MACzE;MAEA,IAAI6K,YAAY,EAAE;QAChB,IAAId,WAAW,EAAE,OAAO/J,QAAQ;QAChC,IAAI0M,4BAA4B,EAAE,OAAOtM,gBAAgB;QAEzD,IAAIiK,0BAA0B,EAAE,OAAOjK,gBAAgB;QAEvD,OAAOK,YAAY,GAAGL,gBAAgB,GAAGD,eAAe;MAC1D;MACA,IAAI,CAAC8K,eAAe,EAAE,OAAOjL,QAAQ;MACrC,IAAIgL,QAAQ,EAAE,OAAOlC,MAAM,IAAIrI,YAAY,GAAGL,gBAAgB,GAAGD,eAAe;MAEhF,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAiB,QAAQ,EAAE,CAAC,MAAM;MACf,IAAI2K,kCAAkC,EAAE,OAAOxL,gBAAgB;MAC/D,IAAI4L,kCAAkC,IAAIxL,UAAU,KAAK,MAAM,IAAIuL,kBAAkB,EAAE;QACrF,OAAO/L,QAAQ;MACjB;MACA,IAAI6K,YAAY,IAAI7B,YAAY,IAAInE,gBAAgB,EAAE,OAAO7E,QAAQ;MACrE,IAAI6L,qBAAqB,EAAE;QACzB,IAAI,CAACvF,eAAe,EAAE,OAAOtG,QAAQ;QACrC,IAAIgN,oDAAoD,EAAE,OAAOhN,QAAQ;QACzE,IAAIoF,KAAK,KAAKG,oBAAS,CAACqD,SAAS,EAAE,OAAOzI,eAAe;QACzD,IAAIiF,KAAK,KAAKG,oBAAS,CAACkD,IAAI,EAAE,OAAOrI,gBAAgB;MACvD;MACA,IAAI4I,YAAY,EAAE;QAChB,IAAI,CAACnE,gBAAgB,EAAE,OAAO7E,QAAQ;QACtC,IAAI,CAACsG,eAAe,EAAE,OAAOlG,gBAAgB;QAC7C,IAAI6L,gBAAgB,EAAE,OAAO7L,gBAAgB;QAE7C,OAAOuK,yBAAyB,GAAGxK,eAAe,GAAGC,gBAAgB;MACvE;MACA,IAAI,CAAC6K,eAAe,EAAE,OAAOjL,QAAQ;MACrC,IAAI6K,YAAY,EAAE;QAChB;QACA;QACA;QACA;QACA,IAAImC,oDAAoD,EAAE;UACxD,OAAOhN,QAAQ;QACjB;QAEA,IAAI2G,gBAAgB,GAAG,CAAC,EAAE;UACxB,OAAO3G,QAAQ;QACjB;QAEA,OAAOsG,eAAe,GAAGnG,eAAe,GAAGH,QAAQ;MACrD;MACA,IAAIoF,KAAK,KAAKG,oBAAS,CAACqD,SAAS,IAAIxD,KAAK,KAAKG,oBAAS,CAACkD,IAAI,EAAE,OAAOtI,eAAe;MAErF,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACAkB,OAAO,EAAE,CAAC,MAAM;MACd,MAAMqM,iBAAiB,GAAGnI,KAAK,KAAKG,oBAAS,CAACqD,SAAS,IAAIxD,KAAK,KAAKG,oBAAS,CAACkD,IAAI;MAEnF,IACEK,MAAM,IACN,CAAC+B,YAAY,IACb,CAACH,wBAAwB,IACzB3F,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACpD,CAAC/C,QAAQ,EAAE4H,WAAW,EACtB;QACA,MAAMyD,eAAe,GAAG,CAAC3G,eAAe,IAAIP,eAAe,IAAI,CAACiF,2BAA2B;QAE3F,OAAO;UAACtL,SAAS,EAAE,IAAI;UAAEC,SAAS,EAAEsN;QAAe,CAAC;MACtD;MAEA,IAAI3C,YAAY,IAAIwB,uCAAuC,EAAE,OAAOjM,gBAAgB;MACpF,IAAIyL,qBAAqB,EAAE,OAAO7L,QAAQ;MAC1C,IAAI,CAACiL,eAAe,IAAI,EAAEsC,iBAAiB,IAAI1C,YAAY,CAAC,EAAE;QAC5D,OAAO7K,QAAQ;MACjB;;MAEA;MACA,IAAI6K,YAAY,EAAE;QAChB;QACA,IAAIlE,gBAAgB,IAAI,CAAC,EAAE,OAAOvG,gBAAgB;QAClD;QACA,MAAMqN,iBAAiB,GACrB,CAAC5G,eAAe,IAChBP,eAAe,IACf,CAAC+D,0BAA0B,IAC3B,CAACkB,2BAA2B,IAC5B,CAACvC,YAAY;QAEf,OAAO;UAAC/I,SAAS,EAAE,IAAI;UAAEC,SAAS,EAAEuN;QAAiB,CAAC;MACxD;;MAEA;MACA,MAAMC,gBAAgB,GACpB,CAAC7G,eAAe,IAAIP,eAAe,IAAI,CAAC+D,0BAA0B,IAAI,CAACN,WAAW;MAEpF,OAAO;QAAC9J,SAAS,EAAE,IAAI;QAAEC,SAAS,EAAEwN;MAAgB,CAAC;IACvD,CAAC,EAAE,CAAC;IAEJ;IACAvM,eAAe,EAAEnB,QAAQ;IAEzB;IACAoB,UAAU,EAAE,CAAC,MAAM;MACjB,IAAI,CAAC4H,YAAY,EAAE,OAAOhJ,QAAQ;MAClC,IAAI+J,WAAW,IAAIX,cAAc,EAAE,OAAOpJ,QAAQ;MAClD,IAAI,CAAC+J,WAAW,IAAIX,cAAc,IAAI,EAAEvE,gBAAgB,IAAIkD,qBAAqB,CAAC,EAAE;QAClF,OAAO/H,QAAQ;MACjB;MAEA,OAAO;QAACC,SAAS,EAAE,IAAI;QAAEC,SAAS,EAAE2E,gBAAgB,IAAI3C,MAAM,CAACyL;MAAmB,CAAC;IACrF,CAAC,EAAE,CAAC;IAEJ;IACAtM,SAAS,EAAE,CAAC,MAAM;MAChB,IAAI,CAACiH,0BAA0B,IAAI,CAACpG,MAAM,CAACgL,kBAAkB,EAAE,OAAOlN,QAAQ;MAC9E,IAAI,CAACiL,eAAe,IAAIjC,YAAY,EAAE,OAAOhJ,QAAQ;MACrD,IAAI6K,YAAY,EAAE;QAChB;QACA;QACA,IAAIT,0BAA0B,EAAE,OAAOhK,gBAAgB;QAEvD,OAAOD,eAAe;MACxB;MACA,IAAI0L,qBAAqB,IAAI,CAACvF,eAAe,EAAE,OAAOtG,QAAQ;MAC9D,IAAIoF,KAAK,KAAKG,oBAAS,CAACqD,SAAS,IAAIxD,KAAK,KAAKG,oBAAS,CAACkD,IAAI,EAAE;QAC7D,OAAOtI,eAAe;MACxB;MAEA,OAAOH,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJ;IACA;IACAsB,UAAU,EAAE,CAAC,MAAM;MACjB,IAAIsK,kCAAkC,IAAIpL,UAAU,KAAK,MAAM,EAAE,OAAOJ,gBAAgB;MACxF,IAAIyL,qBAAqB,EAAE;QACzB,IAAI,CAACvF,eAAe,EAAE,OAAOtG,QAAQ;QACrC,IAAIoF,KAAK,KAAKG,oBAAS,CAACqD,SAAS,EAAE;UACjC,OAAO/B,eAAe,GAAGzG,gBAAgB,GAAGD,eAAe;QAC7D;QACA,IAAIiF,KAAK,KAAKG,oBAAS,CAACkD,IAAI,EAAE,OAAOrI,gBAAgB;QAErD,OAAOJ,QAAQ;MACjB;MACA,IAAI,CAACiL,eAAe,IAAI,CAACjC,YAAY,EAAE,OAAOhJ,QAAQ;MACtD,IAAI,CAAC6E,gBAAgB,EAAE,OAAO7E,QAAQ;MACtC,IAAI,CAACsG,eAAe,EAAE,OAAOlG,gBAAgB;MAC7C,IAAI6L,gBAAgB,EAAE,OAAO7L,gBAAgB;MAE7C,OAAOuK,yBAAyB,IAAI,CAAC9D,eAAe,GAAG1G,eAAe,GAAGC,gBAAgB;IAC3F,CAAC,EAAE,CAAC;IAEJ;IACAmB,MAAM,EAAEd,YAAY,GAAGN,eAAe,GAAGH,QAAQ;IAEjD;IACAwB,cAAc,EAAE,CAAC,MAAM;MACrB,IAAI+K,qCAAqC,EAAE,OAAOvM,QAAQ;MAC1D,IAAIyM,uDAAuD,EAAE,OAAOzM,QAAQ;MAC5E,IAAI6M,uCAAuC,EAAE,OAAO1M,eAAe;MACnE,IAAIyM,0CAA0C,EAAE,OAAOxM,gBAAgB;MACvE,IAAIoM,mDAAmD,EAAE,OAAOxM,QAAQ;MACxE,IAAI0M,4BAA4B,EAAE,OAAOtM,gBAAgB;MACzD,IAAI2J,WAAW,IAAI,CAACX,cAAc,EAAE,OAAOpJ,QAAQ;MACnD,IAAI,CAAC6K,YAAY,EAAE,OAAO7K,QAAQ;MAClC,IAAIiK,8BAA8B,EAAE,OAAO9J,eAAe;MAC1D,IAAIwG,gBAAgB,IAAI,CAAC,EAAE,OAAO3G,QAAQ;MAC1C,IAAIqK,0BAA0B,EAAE,OAAOjK,gBAAgB;MACvD,MAAMwN,wBAAwB,GAAG/I,gBAAgB,IAAImE,YAAY,IAAIjB,qBAAqB;MAE1F,OAAO6F,wBAAwB,GAAGxN,gBAAgB,GAAGD,eAAe;IACtE,CAAC,EAAE,CAAC;IAEJ;IACAsB,kBAAkB,EAAE,CAAC,MAAM;MACzB,IAAIuK,kCAAkC,IAAI,CAACD,kBAAkB,EAAE,OAAO3L,gBAAgB;MACtF,MAAMyN,2BAA2B,GAC/BrN,UAAU,KAAK,SAAS,IAAIqK,YAAY,IAAIK,0BAA0B,IAAItB,eAAe;MAC3F,MAAMkE,gCAAgC,GAAG/I,eAAe,EAAEG,YAAY,KAAK,YAAY;MACvF,MAAM6I,2BAA2B,GAC/BF,2BAA2B,IAC1BhD,YAAY,IACXK,0BAA0B,IAC1BtB,eAAe,KACdZ,YAAY,IAAIqB,0BAA0B,IAAIyD,gCAAgC,CAAE;MACrF,IAAI7B,gBAAgB,EAAE,OAAOjM,QAAQ;MACrC,IAAI6L,qBAAqB,IAAI,CAACkC,2BAA2B,EAAE,OAAO/N,QAAQ;MAC1E,IAAI,CAAC+N,2BAA2B,KAAK,CAAClD,YAAY,IAAI,CAAC7B,YAAY,CAAC,EAAE,OAAOhJ,QAAQ;MACrF,IAAI,CAACkL,0BAA0B,IAAInB,WAAW,EAAE,OAAO/J,QAAQ;MAE/D,OAAO2K,yBAAyB,GAAGxK,eAAe,GAAGC,gBAAgB;IACvE,CAAC,EAAE,CAAC;IAEJ;IACAsB,iBAAiB,EAAE,CAAC,MAAM;MACxB,IAAIkK,kCAAkC,IAAIpL,UAAU,KAAK,SAAS,EAAE,OAAOJ,gBAAgB;MAC3F,IAAI,CAAC4I,YAAY,IAAI,CAACnE,gBAAgB,EAAE,OAAO7E,QAAQ;MACvD,IAAI,CAACsG,eAAe,EAAE,OAAOlG,gBAAgB;MAC7C,IAAI6L,gBAAgB,EAAE,OAAO7L,gBAAgB;MAE7C,OAAOuK,yBAAyB,IAAI,CAAC9D,eAAe,GAAG1G,eAAe,GAAGC,gBAAgB;IAC3F,CAAC,EAAE,CAAC;IAEJ;IACAuB,MAAM,EAAE,CAAC,MAAM;MACb,IAAIiK,kCAAkC,IAAIpL,UAAU,KAAK,SAAS,EAAE,OAAOJ,gBAAgB;MAC3F,IAAI,CAACkG,eAAe,IAAIuF,qBAAqB,EAAE,OAAO7L,QAAQ;MAC9D,IAAIQ,UAAU,KAAK,SAAS,EAAE;QAC5B,IAAI,CAACwI,YAAY,IAAI,CAACnE,gBAAgB,IAAIsD,eAAe,EAAE,OAAOnI,QAAQ;QAC1E,IAAI,CAACsG,eAAe,EAAE,OAAOlG,gBAAgB;QAE7C,OAAOuK,yBAAyB,GAAGxK,eAAe,GAAGC,gBAAgB;MACvE;MAEA,IAAIyL,qBAAqB,IAAIzG,KAAK,KAAKG,oBAAS,CAACqD,SAAS,EAAE;QAC1D,OAAO+B,yBAAyB,GAAGxK,eAAe,GAAGC,gBAAgB;MACvE;MAEA,OAAOJ,QAAQ;IACjB,CAAC,EAAE,CAAC;IAEJW,MAAM,EAAE,CAAC,MAAM;MACb,IAAIJ,cAAc,IAAI,CAACE,YAAY,EAAE;QACnC,OAAOD,UAAU,KAAK,MAAM,GAAGL,eAAe,GAAGH,QAAQ;MAC3D;MAEA,OAAOA,QAAQ;IACjB,CAAC,EAAE;EACL,CAAC;AACH;AAEA,SAASgO,mCAAmCA,CAC1C5I,KAAgB,EAChBC,OAAoB,EACpBC,gBAA2B,EACJ;EACvB,MAAMnD,QAAQ,GAAGkD,OAAO,CAAClD,QAAQ,IAAImD,gBAAgB,IAAI,IAAI;EAC7D,MAAM6H,YAAY,GAAGhL,QAAQ,EAAEO,WAAW,EAAEyK,YAAY,IAAI,KAAK;EAEjE,MAAMpE,WAAW,GAAG3D,KAAK,KAAKG,oBAAS,CAACqD,SAAS;EACjD,MAAMnI,YAAY,GAAG2E,KAAK,KAAKG,oBAAS,CAAC+D,WAAW;EAEpD,OAAO;IACLzI,MAAM,EAAEuE,KAAK,KAAKG,oBAAS,CAACgC,OAAO,GAAGpH,eAAe,GAAGH,QAAQ;IAChEc,OAAO,EAAEd,QAAQ;IACjBe,IAAI,EAAEf,QAAQ;IACdU,IAAI,EAAEV,QAAQ;IACdgB,GAAG,EAAE+H,WAAW,IAAI,CAACtI,YAAY,GAAGN,eAAe,GAAGH,QAAQ;IAC9DiB,QAAQ,EAAE8H,WAAW,IAAI,CAACtI,YAAY,GAAGN,eAAe,GAAGH,QAAQ;IACnEkB,OAAO,EAAElB,QAAQ;IACjBmB,eAAe,EAAEnB,QAAQ;IACzBoB,UAAU,EAAEpB,QAAQ;IACpBqB,SAAS,EAAErB,QAAQ;IACnBsB,UAAU,EAAEtB,QAAQ;IACpBuB,MAAM,EAAE4L,YAAY,IAAI1M,YAAY,GAAGN,eAAe,GAAGH,QAAQ;IACjEwB,cAAc,EAAExB,QAAQ;IACxByB,kBAAkB,EAAEzB,QAAQ;IAC5B0B,iBAAiB,EAAE1B,QAAQ;IAC3B2B,MAAM,EAAE3B,QAAQ;IAChBW,MAAM,EAAEX;EACV,CAAC;AACH;AAEA,SAASiO,gBAAgBA,CACvBtC,YAAuB,EACvBtG,OAAoB,EACpBnD,MAAuB,EACvBoD,gBAA2B,EACoE;EAC/F,IAAIqG,YAAY,KAAKpG,oBAAS,CAAC+D,WAAW,EAAE;IAC1C,OAAO;MACLjF,aAAa,EAAE,KAAK;MACpBvC,SAAS,EAAE,MAAM;MACjBoM,SAAS,EAAEvC,YAAY;MACvBzG,YAAY,EAAEK,oBAAS,CAAC0D;IAC1B,CAAC;EACH;EAEA,MAAM9G,QAAQ,GAAGmD,gBAAgB,IAAID,OAAO,CAAClD,QAAQ,IAAI,IAAI;EAC7D,MAAMO,WAAW,GAAGP,QAAQ,EAAEO,WAAW;EACzC,MAAM+C,UAAU,GAAG/C,WAAW,EAAEgD,iBAAiB,IAAIvD,QAAQ,EAAEwD,aAAa;EAC5E,MAAMb,WAAW,GAAG5C,MAAM,CAAC6E,OAAO,IAAI5E,QAAQ,EAAE4E,OAAO;EAEvD,IAAI1B,OAAO,CAACgD,oCAAoC,IAAIlG,QAAQ,EAAE;IAC5D,MAAM4F,qBAAqB,GAAG,IAAAC,oCAAyB,EAAC7F,QAAQ,CAAC;IACjE,MAAMwE,gBAAgB,GACpBjE,WAAW,IAAI+C,UAAU,GAAG,IAAAmB,yCAA8B,EAAClE,WAAW,EAAE+C,UAAU,CAAC,GAAG,CAAC;IAEzF,IACEkB,gBAAgB,IAAI,CAAC,KACpBgF,YAAY,KAAKpG,oBAAS,CAAC8D,YAAY,IAAItB,qBAAqB,CAAC,EAClE;MACA,OAAO;QACL1D,aAAa,EAAE,KAAK;QACpBvC,SAAS,EAAE,MAAM;QACjBoM,SAAS,EAAE3I,oBAAS,CAAC8D,YAAY;QACjCnE,YAAY,EAAEK,oBAAS,CAAC0D;MAC1B,CAAC;IACH;EACF;EAEA,MAAMlE,eAAe,GAAGD,WAAW,GAAGpC,WAAW,EAAE6D,YAAY,GAAGzB,WAAW,CAAC,GAAG,IAAI;EACrF,MAAM8E,eAAe,GAAG1F,4BAA4B,CAClDxB,WAAW,EACXP,QAAQ,EAAEgC,sBACZ,CAAC;EACD,MAAM0F,yCAAyC,GAC7C1H,QAAQ,EAAEU,IAAI,KAAK,oBAAoB,IAAIwC,OAAO,CAACgD,oCAAoC;EACzF,MAAMyB,sBAAsB,GAC1B/E,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IAAI/C,QAAQ,EAAE4H,WAAW,KAAK,KAAK;EACzF,MAAMC,qBAAqB,GACzB7H,QAAQ,EAAEU,IAAI,KAAK,mBAAmB,IACrCV,QAAQ,EAAEU,IAAI,KAAK,oBAAoB,IAAI,CAACgH,yCAA0C,IACvFC,sBAAsB;EACxB,MAAMjC,iBAAiB,GAAG,IAAAC,sDAA2C,EACnEpF,WAAW,EACX+C,UAAU,EACVX,WACF,CAAC;EACD,MAAMqJ,iBAAiB,GACrBxC,YAAY,KAAKpG,oBAAS,CAAC0D,UAAU,IACrC0C,YAAY,KAAKpG,oBAAS,CAAC2D,kBAAkB,IAC7CyC,YAAY,KAAKpG,oBAAS,CAAC4D,eAAe;EAC5C,MAAMM,YAAY,GAAGnF,MAAM,CAACC,MAAM,CAAC7B,WAAW,EAAE0B,KAAK,IAAI,CAAC,CAAC,CAAC,CAACsF,IAAI,CAC9DtF,KAAU,IACTA,KAAK,EAAEuF,eAAe,KAAKxH,QAAQ,EAAEgC,sBAAsB,IAAIC,KAAK,EAAEM,KAAK,KAAK,SACpF,CAA0C;EAC1C,MAAMM,iBAAiB,GACrBL,OAAO,CAACG,WAAW,CAAC,IAAIH,OAAO,CAAC8E,YAAY,EAAElD,YAAY,EAAEiD,QAAQ,CAAC1E,WAAqB,CAAC,CAAC;EAC9F,MAAMoG,0BAA0B,GAAGtG,4BAA4B,CAC7DS,OAAO,CAACR,gBAAgB,EACxBC,WAAW,EACXC,eAAe,EACfC,iBAAiB,EACjB7C,QAAQ,EAAE8C,iBACZ,CAAC;EACD,MAAMkG,kBAAkB,GACtB,CAAC9F,OAAO,CAACgD,oCAAoC,IAAI6C,0BAA0B;EAC7E,MAAME,gCAAgC,GACpCrG,eAAe,EAAEG,YAAY,KAAK,kBAAkB,IACpD,CAAC/C,QAAQ,EAAE4H,WAAW,IACtBH,eAAe;EACjB,MAAMwE,4BAA4B,GAChCrJ,eAAe,EAAEG,YAAY,KAAK,YAAY,IAAI0E,eAAe;EACnE,MAAMmD,0BAA0B,GAC9BjD,sBAAsB,IACtBnF,OAAO,CAACc,UAAU,IAAItD,QAAQ,EAAEO,WAAW,EAAE0B,KAAK,GAAGqB,UAAU,CAAC,EAAE4I,MAAM,KAAK,IAAI,CAAC,IAClFlM,QAAQ,EAAEO,WAAW,EAAE0C,KAAK,KAAK,YAAY,IAC7C,CAAC,IAAA4C,oCAAyB,EAAC7F,QAAQ,CAAC;EACtC,MAAMkC,aAAa,GAAGM,OAAO,CAC3B,CAACqF,qBAAqB,IACpB,CAACtH,WAAW,EAAEyK,YAAY,IAC1B,CAACJ,0BAA0B,KAC1B5B,kBAAkB,IAAIiD,4BAA4B,IAAIhD,gCAAgC,CAAC,KACvFvD,iBAAiB,IAAIsG,iBAAiB,IAAI9I,OAAO,CAAC8C,eAAe,IAAIyB,eAAe,CACzF,CAAC;EAED,IAAI,CAACvF,aAAa,EAAE;IAClB,IAAI6J,SAAS,GAAGvC,YAAY;IAC5B,IAAI3B,qBAAqB,IAAI7H,QAAQ,EAAEO,WAAW,EAAE;MAClD,MAAM4L,cAAc,GAAGnM,QAAQ,CAACO,WAAW,CAACgD,iBAAiB,IAAIvD,QAAQ,CAACwD,aAAa;MACvF,MAAM4I,UAAU,GAAG5J,OAAO,CACxB2J,cAAc,IAAInM,QAAQ,CAACO,WAAW,CAAC0B,KAAK,GAAGkK,cAAc,CAAC,EAAED,MAAM,KAAK,IAC7E,CAAC;MAED,IAAIlM,QAAQ,CAACO,WAAW,CAAC0C,KAAK,KAAK,YAAY,IAAI,IAAA4C,oCAAyB,EAAC7F,QAAQ,CAAC,EAAE;QACtF+L,SAAS,GAAG3I,oBAAS,CAAC8D,YAAY;MACpC,CAAC,MAAM,IAAIkF,UAAU,IAAIpM,QAAQ,CAACO,WAAW,CAAC0C,KAAK,KAAK,MAAM,EAAE;QAC9D8I,SAAS,GAAG3I,oBAAS,CAACkD,IAAI;MAC5B,CAAC,MAAM;QACLyF,SAAS,GAAG3I,oBAAS,CAACqD,SAAS;MACjC;IACF;IAEA,OAAO;MACLvE,aAAa,EAAE,KAAK;MACpBvC,SAAS,EAAE,MAAM;MACjBoM,SAAS;MACThJ,YAAY,EAAEK,oBAAS,CAAC0D;IAC1B,CAAC;EACH;EAEA,IAAIiF,SAAS,GAAG3I,oBAAS,CAACkD,IAAI;EAC9B,IAAIkD,YAAY,KAAKpG,oBAAS,CAAC8D,YAAY,EAAE;IAC3C6E,SAAS,GAAG3I,oBAAS,CAAC8D,YAAY;EACpC,CAAC,MAAM,IAAIhE,OAAO,CAAC8C,eAAe,EAAE;IAClC,MAAMqG,WAAW,GAAGrM,QAAQ,EAAEO,WAAW,EAAEgD,iBAAiB,IAAIvD,QAAQ,EAAEwD,aAAa;IACvF,MAAM4I,UAAU,GAAG5J,OAAO,CACxB6J,WAAW,IAAIrM,QAAQ,EAAEO,WAAW,EAAE0B,KAAK,GAAGoK,WAAW,CAAC,EAAEH,MAAM,KAAK,IACzE,CAAC;IACDH,SAAS,GACPK,UAAU,IAAIpM,QAAQ,EAAEO,WAAW,EAAE0C,KAAK,KAAK,MAAM,GAAGG,oBAAS,CAACkD,IAAI,GAAGlD,oBAAS,CAACqD,SAAS;EAChG,CAAC,MAAM,IAAI+C,YAAY,KAAKpG,oBAAS,CAACqD,SAAS,IAAI+C,YAAY,KAAKpG,oBAAS,CAACkD,IAAI,EAAE;IAClFyF,SAAS,GAAGvC,YAAY;EAC1B;EAEA,OAAO;IACLtH,aAAa,EAAE,IAAI;IACnBvC,SAAS,EAAEuD,OAAO,CAAC8C,eAAe,GAAG,MAAM,GAAG,SAAS;IACvD+F,SAAS;IACThJ,YAAY,EAAEiJ,iBAAiB,GAAGxC,YAAY,GAAGpG,oBAAS,CAAC0D;EAC7D,CAAC;AACH;AAEO,SAASwF,iBAAiBA,CAC/B9C,YAAuB,EACvBtG,OAAoB,EACpBC,gBAA2B,EACX;EAChB,IAAIqG,YAAY,KAAKpG,oBAAS,CAACmJ,UAAU,IAAI/C,YAAY,KAAKpG,oBAAS,CAACoJ,SAAS,EAAE;IACjF,OAAO3M,oBAAoB,CAAC,CAAC;EAC/B;EAEA,MAAMD,2BAA2B,GAAGE,8BAA8B,CAChEoD,OAAO,CAACuJ,eAAe,EACvBtJ,gBAAgB,IAAID,OAAO,CAAClD,QAC9B,CAAC;EAED,QAAQkD,OAAO,CAACuJ,eAAe,CAACrM,WAAW;IACzC,KAAKC,wBAAiB,CAACC,KAAK;MAAE;QAC5B,MAAM;UAAC4B,aAAa;UAAEvC,SAAS;UAAEoM,SAAS;UAAEhJ;QAAY,CAAC,GAAG+I,gBAAgB,CAC1EtC,YAAY,EACZtG,OAAO,EACPA,OAAO,CAACuJ,eAAe,EACvBtJ,gBACF,CAAC;QAED,MAAMuJ,YAAY,GAAG1J,iCAAiC,CACpD+I,SAAS,EACT7I,OAAO,EACPA,OAAO,CAACuJ,eAAe,EACvBtJ,gBAAgB,EAChB,MACF,CAAC;QACD,MAAMwJ,eAAe,GAAGzK,aAAa,GACjCc,iCAAiC,CAC/BD,YAAY,EACZG,OAAO,EACPA,OAAO,CAACuJ,eAAe,EACvBtJ,gBAAgB,EAChB,SACF,CAAC,GACD1E,+BAA+B,CAAC,CAAC;QAErC,OAAOgB,oBAAoB,CACzBiN,YAAY,EACZC,eAAe,EACfhN,SAAS,EACTC,2BACF,CAAC;MACH;IACA,KAAKS,wBAAiB,CAACuM,OAAO;MAC5B,OAAOnN,oBAAoB,CACzBoM,mCAAmC,CAACrC,YAAY,EAAEtG,OAAO,EAAEC,gBAAgB,CAAC,EAC5E1E,+BAA+B,CAAC,CAAC,EACjC,MAAM,EACNmB,2BACF,CAAC;IACH;MACE,OAAOC,oBAAoB,CAAC,CAAC;EACjC;AACF;AAEA,SAASgN,gCAAgCA,CACvCC,QAA+B,EAC/BC,IAA2B,EAClB;EACT,OAAQ5K,MAAM,CAAC6K,IAAI,CAACD,IAAI,CAAC,CAAqC1K,IAAI,CAAE4K,GAAG,IAAK;IAC1E,MAAMC,IAAI,GAAGJ,QAAQ,CAACG,GAAG,CAAC;IAC1B,MAAME,IAAI,GAAGJ,IAAI,CAACE,GAAG,CAAC;IAEtB,OAAOC,IAAI,CAACpP,SAAS,KAAKqP,IAAI,CAACrP,SAAS,IAAIoP,IAAI,CAACnP,SAAS,KAAKoP,IAAI,CAACpP,SAAS;EAC/E,CAAC,CAAC;AACJ;AAEA,SAASqP,0BAA0BA,CACjCN,QAAwC,EACxCC,IAAoC,EAC3B;EACT,OACED,QAAQ,CAACO,MAAM,KAAKN,IAAI,CAACM,MAAM,IAC/BP,QAAQ,CAACzK,IAAI,CAAC,CAACiL,WAAW,EAAEC,KAAK,KAAKD,WAAW,KAAKP,IAAI,CAACQ,KAAK,CAAC,CAAC;AAEtE;AAEO,SAASC,qBAAqBA,CACnCV,QAAoC,EACpCC,IAAoB,EACX;EACT,IAAI,CAACD,QAAQ,EAAE,OAAO,IAAI;EAE1B,OACEA,QAAQ,CAACnN,SAAS,KAAKoN,IAAI,CAACpN,SAAS,IACrCyN,0BAA0B,CACxBN,QAAQ,CAAClN,2BAA2B,CAACb,OAAO,EAC5CgO,IAAI,CAACnN,2BAA2B,CAACb,OACnC,CAAC,IACDqO,0BAA0B,CACxBN,QAAQ,CAAClN,2BAA2B,CAACd,QAAQ,EAC7CiO,IAAI,CAACnN,2BAA2B,CAACd,QACnC,CAAC,IACD+N,gCAAgC,CAACC,QAAQ,CAACpN,IAAI,EAAEqN,IAAI,CAACrN,IAAI,CAAC,IAC1DmN,gCAAgC,CAACC,QAAQ,CAAC/N,OAAO,EAAEgO,IAAI,CAAChO,OAAO,CAAC;AAEpE","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.normalizeTaskData = normalizeTaskData;
|
|
7
|
+
const booleanKeys = ['recordingStarted', 'recordInProgress', 'isPaused', 'pauseResumeEnabled', 'ctqInProgress', 'outdialTransferToQueueEnabled', 'taskToBeSelfServiced', 'CONTINUE_RECORDING_ON_TRANSFER', 'isParked', 'participantInviteTimeout', 'checkAgentAvailability'];
|
|
8
|
+
const interactionBooleanKeys = ['isFcManaged', 'isMediaForked', 'isTerminated'];
|
|
9
|
+
const participantBooleanKeys = ['autoAnswerEnabled', 'hasJoined', 'hasLeft', 'isConsulted', 'isInPredial', 'isOffered', 'isWrapUp', 'isWrappedUp'];
|
|
10
|
+
const toBoolean = value => {
|
|
11
|
+
if (typeof value === 'boolean') {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === 'string') {
|
|
15
|
+
const normalized = value.toLowerCase();
|
|
16
|
+
if (normalized === 'true') {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (normalized === 'false') {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
};
|
|
25
|
+
const normalizeFields = (obj, keys) => {
|
|
26
|
+
let updated;
|
|
27
|
+
keys.forEach(key => {
|
|
28
|
+
const normalized = toBoolean(obj[key]);
|
|
29
|
+
if (typeof normalized !== 'undefined') {
|
|
30
|
+
if (!updated) {
|
|
31
|
+
updated = {
|
|
32
|
+
...obj
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
updated[key] = normalized;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return updated;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Normalize backend task payload quirks so downstream code can rely on actual booleans.
|
|
43
|
+
*
|
|
44
|
+
* Applies to every Agent Contact websocket event before it reaches the state machine:
|
|
45
|
+
* - Converts string booleans in callProcessingDetails to actual booleans.
|
|
46
|
+
* - Also normalizes known boolean fields on interaction and participants.
|
|
47
|
+
* - Keeps payload shape intact; only coerces known boolean fields.
|
|
48
|
+
*/
|
|
49
|
+
function normalizeTaskData(data) {
|
|
50
|
+
const interaction = data?.interaction;
|
|
51
|
+
if (!interaction) {
|
|
52
|
+
return data;
|
|
53
|
+
}
|
|
54
|
+
const details = interaction.callProcessingDetails;
|
|
55
|
+
const updatedDetails = details ? normalizeFields(details, booleanKeys) : undefined;
|
|
56
|
+
const updatedInteractionBooleans = normalizeFields(interaction, interactionBooleanKeys);
|
|
57
|
+
let updatedParticipants;
|
|
58
|
+
const participants = interaction.participants || {};
|
|
59
|
+
Object.keys(participants).forEach(id => {
|
|
60
|
+
const participant = participants[id];
|
|
61
|
+
const normalized = normalizeFields(participant, participantBooleanKeys);
|
|
62
|
+
if (normalized) {
|
|
63
|
+
if (!updatedParticipants) {
|
|
64
|
+
updatedParticipants = {
|
|
65
|
+
...participants
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
updatedParticipants[id] = normalized;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
let updatedMedia;
|
|
72
|
+
const mediaEntries = interaction.media || {};
|
|
73
|
+
Object.keys(mediaEntries).forEach(id => {
|
|
74
|
+
const media = mediaEntries[id];
|
|
75
|
+
const normalized = normalizeFields(media, ['isHold']);
|
|
76
|
+
if (normalized) {
|
|
77
|
+
if (!updatedMedia) {
|
|
78
|
+
updatedMedia = {
|
|
79
|
+
...mediaEntries
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
updatedMedia[id] = normalized;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
if (!updatedDetails && !updatedInteractionBooleans && !updatedParticipants && !updatedMedia) {
|
|
86
|
+
return data;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
...data,
|
|
90
|
+
interaction: {
|
|
91
|
+
...interaction,
|
|
92
|
+
...(updatedInteractionBooleans || {}),
|
|
93
|
+
callProcessingDetails: updatedDetails || details,
|
|
94
|
+
participants: updatedParticipants || interaction.participants,
|
|
95
|
+
media: updatedMedia || interaction.media
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=taskDataNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["booleanKeys","interactionBooleanKeys","participantBooleanKeys","toBoolean","value","normalized","toLowerCase","undefined","normalizeFields","obj","keys","updated","forEach","key","normalizeTaskData","data","interaction","details","callProcessingDetails","updatedDetails","updatedInteractionBooleans","updatedParticipants","participants","Object","id","participant","updatedMedia","mediaEntries","media"],"sources":["taskDataNormalizer.ts"],"sourcesContent":["import {\n CallProcessingBooleanKey,\n InteractionBooleanKey,\n ParticipantBooleanKey,\n TaskData,\n} from './types';\n\nconst booleanKeys: CallProcessingBooleanKey[] = [\n 'recordingStarted',\n 'recordInProgress',\n 'isPaused',\n 'pauseResumeEnabled',\n 'ctqInProgress',\n 'outdialTransferToQueueEnabled',\n 'taskToBeSelfServiced',\n 'CONTINUE_RECORDING_ON_TRANSFER',\n 'isParked',\n 'participantInviteTimeout',\n 'checkAgentAvailability',\n];\n\nconst interactionBooleanKeys: InteractionBooleanKey[] = [\n 'isFcManaged',\n 'isMediaForked',\n 'isTerminated',\n];\n\nconst participantBooleanKeys: ParticipantBooleanKey[] = [\n 'autoAnswerEnabled',\n 'hasJoined',\n 'hasLeft',\n 'isConsulted',\n 'isInPredial',\n 'isOffered',\n 'isWrapUp',\n 'isWrappedUp',\n];\n\nconst toBoolean = (value: unknown): boolean | undefined => {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalized = value.toLowerCase();\n\n if (normalized === 'true') {\n return true;\n }\n if (normalized === 'false') {\n return false;\n }\n }\n\n return undefined;\n};\n\nconst normalizeFields = <T extends Record<string, any>>(obj: T, keys: string[]): T | undefined => {\n let updated: T | undefined;\n\n keys.forEach((key) => {\n const normalized = toBoolean(obj[key]);\n\n if (typeof normalized !== 'undefined') {\n if (!updated) {\n updated = {...obj};\n }\n (updated as any)[key] = normalized;\n }\n });\n\n return updated;\n};\n\n/**\n * Normalize backend task payload quirks so downstream code can rely on actual booleans.\n *\n * Applies to every Agent Contact websocket event before it reaches the state machine:\n * - Converts string booleans in callProcessingDetails to actual booleans.\n * - Also normalizes known boolean fields on interaction and participants.\n * - Keeps payload shape intact; only coerces known boolean fields.\n */\nexport function normalizeTaskData(data: TaskData): TaskData {\n const interaction = data?.interaction;\n\n if (!interaction) {\n return data;\n }\n\n const details = interaction.callProcessingDetails;\n const updatedDetails = details ? normalizeFields(details, booleanKeys) : undefined;\n const updatedInteractionBooleans = normalizeFields(\n interaction,\n interactionBooleanKeys as string[]\n );\n\n let updatedParticipants: typeof interaction.participants | undefined;\n const participants = interaction.participants || {};\n Object.keys(participants).forEach((id) => {\n const participant = participants[id];\n const normalized = normalizeFields(participant, participantBooleanKeys);\n if (normalized) {\n if (!updatedParticipants) {\n updatedParticipants = {...participants};\n }\n updatedParticipants[id] = normalized;\n }\n });\n\n let updatedMedia: typeof interaction.media | undefined;\n const mediaEntries = interaction.media || {};\n Object.keys(mediaEntries).forEach((id) => {\n const media = mediaEntries[id];\n const normalized = normalizeFields(media, ['isHold']);\n if (normalized) {\n if (!updatedMedia) {\n updatedMedia = {...mediaEntries};\n }\n updatedMedia[id] = normalized;\n }\n });\n\n if (!updatedDetails && !updatedInteractionBooleans && !updatedParticipants && !updatedMedia) {\n return data;\n }\n\n return {\n ...data,\n interaction: {\n ...interaction,\n ...(updatedInteractionBooleans || {}),\n callProcessingDetails: updatedDetails || details,\n participants: updatedParticipants || interaction.participants,\n media: updatedMedia || interaction.media,\n },\n };\n}\n"],"mappings":";;;;;;AAOA,MAAMA,WAAuC,GAAG,CAC9C,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,+BAA+B,EAC/B,sBAAsB,EACtB,gCAAgC,EAChC,UAAU,EACV,0BAA0B,EAC1B,wBAAwB,CACzB;AAED,MAAMC,sBAA+C,GAAG,CACtD,aAAa,EACb,eAAe,EACf,cAAc,CACf;AAED,MAAMC,sBAA+C,GAAG,CACtD,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,CACd;AAED,MAAMC,SAAS,GAAIC,KAAc,IAA0B;EACzD,IAAI,OAAOA,KAAK,KAAK,SAAS,EAAE;IAC9B,OAAOA,KAAK;EACd;EAEA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,MAAMC,UAAU,GAAGD,KAAK,CAACE,WAAW,CAAC,CAAC;IAEtC,IAAID,UAAU,KAAK,MAAM,EAAE;MACzB,OAAO,IAAI;IACb;IACA,IAAIA,UAAU,KAAK,OAAO,EAAE;MAC1B,OAAO,KAAK;IACd;EACF;EAEA,OAAOE,SAAS;AAClB,CAAC;AAED,MAAMC,eAAe,GAAGA,CAAgCC,GAAM,EAAEC,IAAc,KAAoB;EAChG,IAAIC,OAAsB;EAE1BD,IAAI,CAACE,OAAO,CAAEC,GAAG,IAAK;IACpB,MAAMR,UAAU,GAAGF,SAAS,CAACM,GAAG,CAACI,GAAG,CAAC,CAAC;IAEtC,IAAI,OAAOR,UAAU,KAAK,WAAW,EAAE;MACrC,IAAI,CAACM,OAAO,EAAE;QACZA,OAAO,GAAG;UAAC,GAAGF;QAAG,CAAC;MACpB;MACCE,OAAO,CAASE,GAAG,CAAC,GAAGR,UAAU;IACpC;EACF,CAAC,CAAC;EAEF,OAAOM,OAAO;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,iBAAiBA,CAACC,IAAc,EAAY;EAC1D,MAAMC,WAAW,GAAGD,IAAI,EAAEC,WAAW;EAErC,IAAI,CAACA,WAAW,EAAE;IAChB,OAAOD,IAAI;EACb;EAEA,MAAME,OAAO,GAAGD,WAAW,CAACE,qBAAqB;EACjD,MAAMC,cAAc,GAAGF,OAAO,GAAGT,eAAe,CAACS,OAAO,EAAEjB,WAAW,CAAC,GAAGO,SAAS;EAClF,MAAMa,0BAA0B,GAAGZ,eAAe,CAChDQ,WAAW,EACXf,sBACF,CAAC;EAED,IAAIoB,mBAAgE;EACpE,MAAMC,YAAY,GAAGN,WAAW,CAACM,YAAY,IAAI,CAAC,CAAC;EACnDC,MAAM,CAACb,IAAI,CAACY,YAAY,CAAC,CAACV,OAAO,CAAEY,EAAE,IAAK;IACxC,MAAMC,WAAW,GAAGH,YAAY,CAACE,EAAE,CAAC;IACpC,MAAMnB,UAAU,GAAGG,eAAe,CAACiB,WAAW,EAAEvB,sBAAsB,CAAC;IACvE,IAAIG,UAAU,EAAE;MACd,IAAI,CAACgB,mBAAmB,EAAE;QACxBA,mBAAmB,GAAG;UAAC,GAAGC;QAAY,CAAC;MACzC;MACAD,mBAAmB,CAACG,EAAE,CAAC,GAAGnB,UAAU;IACtC;EACF,CAAC,CAAC;EAEF,IAAIqB,YAAkD;EACtD,MAAMC,YAAY,GAAGX,WAAW,CAACY,KAAK,IAAI,CAAC,CAAC;EAC5CL,MAAM,CAACb,IAAI,CAACiB,YAAY,CAAC,CAACf,OAAO,CAAEY,EAAE,IAAK;IACxC,MAAMI,KAAK,GAAGD,YAAY,CAACH,EAAE,CAAC;IAC9B,MAAMnB,UAAU,GAAGG,eAAe,CAACoB,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAIvB,UAAU,EAAE;MACd,IAAI,CAACqB,YAAY,EAAE;QACjBA,YAAY,GAAG;UAAC,GAAGC;QAAY,CAAC;MAClC;MACAD,YAAY,CAACF,EAAE,CAAC,GAAGnB,UAAU;IAC/B;EACF,CAAC,CAAC;EAEF,IAAI,CAACc,cAAc,IAAI,CAACC,0BAA0B,IAAI,CAACC,mBAAmB,IAAI,CAACK,YAAY,EAAE;IAC3F,OAAOX,IAAI;EACb;EAEA,OAAO;IACL,GAAGA,IAAI;IACPC,WAAW,EAAE;MACX,GAAGA,WAAW;MACd,IAAII,0BAA0B,IAAI,CAAC,CAAC,CAAC;MACrCF,qBAAqB,EAAEC,cAAc,IAAIF,OAAO;MAChDK,YAAY,EAAED,mBAAmB,IAAIL,WAAW,CAACM,YAAY;MAC7DM,KAAK,EAAEF,YAAY,IAAIV,WAAW,CAACY;IACrC;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -3,12 +3,18 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.TASK_EVENTS = exports.MEDIA_CHANNEL = exports.DESTINATION_TYPE = exports.CONSULT_TRANSFER_DESTINATION_TYPE = void 0;
|
|
6
|
+
exports.VOICE_VARIANT = exports.TASK_EVENTS = exports.TASK_CHANNEL_TYPE = exports.MEDIA_CHANNEL = exports.DESTINATION_TYPE = exports.CONSULT_TRANSFER_DESTINATION_TYPE = void 0;
|
|
7
|
+
/* eslint-disable import/no-cycle */
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* Unique identifier for a task in the contact center system
|
|
9
11
|
* @public
|
|
10
12
|
*/
|
|
11
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Unique identifier for a call in the Webex calling system
|
|
16
|
+
*/
|
|
17
|
+
|
|
12
18
|
/**
|
|
13
19
|
* Helper type for creating enum-like objects with type safety
|
|
14
20
|
* @internal
|
|
@@ -26,7 +32,7 @@ const DESTINATION_TYPE = exports.DESTINATION_TYPE = {
|
|
|
26
32
|
DIALNUMBER: 'dialNumber',
|
|
27
33
|
/** Route task to a specific agent */
|
|
28
34
|
AGENT: 'agent',
|
|
29
|
-
/** Route task to an entry point
|
|
35
|
+
/** Route task to an entry point */
|
|
30
36
|
ENTRYPOINT: 'entryPoint'
|
|
31
37
|
};
|
|
32
38
|
|
|
@@ -58,6 +64,11 @@ const CONSULT_TRANSFER_DESTINATION_TYPE = exports.CONSULT_TRANSFER_DESTINATION_T
|
|
|
58
64
|
* @public
|
|
59
65
|
*/
|
|
60
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Agent-profile policy used by the task state machine to derive consult/transfer destinations.
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
|
|
61
72
|
/**
|
|
62
73
|
* Defines all supported media channel types for customer interactions
|
|
63
74
|
* These represent the different ways customers can communicate with agents
|
|
@@ -85,6 +96,21 @@ const MEDIA_CHANNEL = exports.MEDIA_CHANNEL = {
|
|
|
85
96
|
* Derived from the MEDIA_CHANNEL constant
|
|
86
97
|
* @public
|
|
87
98
|
*/
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Supported task channel types for UI control configuration
|
|
102
|
+
*/
|
|
103
|
+
const TASK_CHANNEL_TYPE = exports.TASK_CHANNEL_TYPE = {
|
|
104
|
+
VOICE: 'voice',
|
|
105
|
+
DIGITAL: 'digital'
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Voice channel variants that toggle PSTN/WebRTC specific behaviors
|
|
109
|
+
*/
|
|
110
|
+
const VOICE_VARIANT = exports.VOICE_VARIANT = {
|
|
111
|
+
PSTN: 'pstn',
|
|
112
|
+
WEBRTC: 'webrtc'
|
|
113
|
+
};
|
|
88
114
|
/**
|
|
89
115
|
* Enumeration of all task-related events that can occur in the contact center system
|
|
90
116
|
* These events represent different states and actions in the task lifecycle
|
|
@@ -189,6 +215,14 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
189
215
|
* ```
|
|
190
216
|
*/
|
|
191
217
|
TASK_EVENTS["TASK_CONSULT_QUEUE_FAILED"] = "task:consultQueueFailed";
|
|
218
|
+
/**
|
|
219
|
+
* Triggered whenever task UI controls are recalculated
|
|
220
|
+
*/
|
|
221
|
+
TASK_EVENTS["TASK_UI_CONTROLS_UPDATED"] = "task:ui-controls-updated";
|
|
222
|
+
/**
|
|
223
|
+
* Triggered when wxApp mute state changes from Webex App (Mercury sync or call details).
|
|
224
|
+
*/
|
|
225
|
+
TASK_EVENTS["TASK_WXAPP_MUTE_STATE_UPDATED"] = "task:wxapp-mute-state-updated";
|
|
192
226
|
/**
|
|
193
227
|
* Triggered when a consultation request is accepted
|
|
194
228
|
* @example
|
|
@@ -266,6 +300,22 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
266
300
|
* ```
|
|
267
301
|
*/
|
|
268
302
|
TASK_EVENTS["TASK_WRAPPEDUP"] = "task:wrappedup";
|
|
303
|
+
/**
|
|
304
|
+
* Triggered when the task state machine reaches a final state and resources should be cleaned up.
|
|
305
|
+
* Used internally by TaskManager to perform collection/call cleanup.
|
|
306
|
+
* @internal
|
|
307
|
+
*/
|
|
308
|
+
TASK_EVENTS["TASK_CLEANUP"] = "task:cleanup";
|
|
309
|
+
/**
|
|
310
|
+
* Triggered when recording is started
|
|
311
|
+
* @example
|
|
312
|
+
* ```typescript
|
|
313
|
+
* task.on(TASK_EVENTS.TASK_RECORDING_STARTED, (task: ITask) => {
|
|
314
|
+
* console.log('Recording started:', task.data.interactionId);
|
|
315
|
+
* });
|
|
316
|
+
* ```
|
|
317
|
+
*/
|
|
318
|
+
TASK_EVENTS["TASK_RECORDING_STARTED"] = "task:recordingStarted";
|
|
269
319
|
/**
|
|
270
320
|
* Triggered when recording is paused
|
|
271
321
|
* @example
|
|
@@ -479,6 +529,40 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
479
529
|
* ```
|
|
480
530
|
*/
|
|
481
531
|
TASK_EVENTS["TASK_PARTICIPANT_LEFT_FAILED"] = "task:participantLeftFailed";
|
|
532
|
+
/**
|
|
533
|
+
* Triggered when agent initiates exit from conference
|
|
534
|
+
* @example
|
|
535
|
+
* ```typescript
|
|
536
|
+
* task.on(TASK_EVENTS.TASK_EXIT_CONFERENCE, (task: ITask) => {
|
|
537
|
+
* console.log('Exiting conference:', task.data.interactionId);
|
|
538
|
+
* // Handle conference exit initiation
|
|
539
|
+
* });
|
|
540
|
+
* ```
|
|
541
|
+
*/
|
|
542
|
+
TASK_EVENTS["TASK_EXIT_CONFERENCE"] = "task:exitConference";
|
|
543
|
+
/**
|
|
544
|
+
* Triggered when agent initiates conference transfer
|
|
545
|
+
* @example
|
|
546
|
+
* ```typescript
|
|
547
|
+
* task.on(TASK_EVENTS.TASK_TRANSFER_CONFERENCE, (task: ITask) => {
|
|
548
|
+
* console.log('Transferring conference:', task.data.interactionId);
|
|
549
|
+
* // Handle conference transfer initiation
|
|
550
|
+
* });
|
|
551
|
+
* ```
|
|
552
|
+
*/
|
|
553
|
+
TASK_EVENTS["TASK_TRANSFER_CONFERENCE"] = "task:transferConference";
|
|
554
|
+
/**
|
|
555
|
+
* Triggered when agent switches between consult call and main call.
|
|
556
|
+
* Use task.uiControls to determine current state and button visibility.
|
|
557
|
+
* @example
|
|
558
|
+
* ```typescript
|
|
559
|
+
* task.on(TASK_EVENTS.TASK_SWITCH_CALL, (task: ITask) => {
|
|
560
|
+
* console.log('Call switched:', task.data.interactionId);
|
|
561
|
+
* // Update UI based on task.uiControls.main.switch / task.uiControls.consult.switch
|
|
562
|
+
* });
|
|
563
|
+
* ```
|
|
564
|
+
*/
|
|
565
|
+
TASK_EVENTS["TASK_SWITCH_CALL"] = "task:switchCall";
|
|
482
566
|
/**
|
|
483
567
|
* Triggered when a contact is merged
|
|
484
568
|
* @example
|
|
@@ -501,6 +585,71 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
501
585
|
* ```
|
|
502
586
|
*/
|
|
503
587
|
TASK_EVENTS["TASK_POST_CALL_ACTIVITY"] = "task:postCallActivity";
|
|
588
|
+
/**
|
|
589
|
+
* Triggered when a multi-login task update should hydrate SDK instances without Mobius registration.
|
|
590
|
+
* @example
|
|
591
|
+
* ```typescript
|
|
592
|
+
* task.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, (task: ITask) => {
|
|
593
|
+
* console.log('Multi-login hydrate:', task.data.interactionId);
|
|
594
|
+
* });
|
|
595
|
+
* ```
|
|
596
|
+
*/
|
|
597
|
+
TASK_EVENTS["TASK_MULTI_LOGIN_HYDRATE"] = "task:multiLoginHydrate";
|
|
598
|
+
/**
|
|
599
|
+
* Triggered when a campaign preview contact is offered to the agent
|
|
600
|
+
* @example
|
|
601
|
+
* ```typescript
|
|
602
|
+
* task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, (data: AgentContact) => {
|
|
603
|
+
* console.log('Campaign preview contact received:', data.interactionId);
|
|
604
|
+
* // Handle campaign preview reservation
|
|
605
|
+
* });
|
|
606
|
+
* ```
|
|
607
|
+
*/
|
|
608
|
+
TASK_EVENTS["TASK_CAMPAIGN_PREVIEW_RESERVATION"] = "task:campaignPreviewReservation";
|
|
609
|
+
/**
|
|
610
|
+
* Triggered when accepting a campaign preview contact fails
|
|
611
|
+
* @example
|
|
612
|
+
* ```typescript
|
|
613
|
+
* task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_ACCEPT_FAILED, (task: ITask) => {
|
|
614
|
+
* console.log('Campaign preview accept failed:', task.data.interactionId);
|
|
615
|
+
* // Handle accept failure
|
|
616
|
+
* });
|
|
617
|
+
* ```
|
|
618
|
+
*/
|
|
619
|
+
TASK_EVENTS["TASK_CAMPAIGN_PREVIEW_ACCEPT_FAILED"] = "task:campaignPreviewAcceptFailed";
|
|
620
|
+
/**
|
|
621
|
+
* Triggered when skipping a campaign preview contact fails
|
|
622
|
+
* @example
|
|
623
|
+
* ```typescript
|
|
624
|
+
* task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_SKIP_FAILED, (task: ITask) => {
|
|
625
|
+
* console.log('Campaign preview skip failed:', task.data.interactionId);
|
|
626
|
+
* // Handle skip failure
|
|
627
|
+
* });
|
|
628
|
+
* ```
|
|
629
|
+
*/
|
|
630
|
+
TASK_EVENTS["TASK_CAMPAIGN_PREVIEW_SKIP_FAILED"] = "task:campaignPreviewSkipFailed";
|
|
631
|
+
/**
|
|
632
|
+
* Triggered when removing a campaign preview contact fails
|
|
633
|
+
* @example
|
|
634
|
+
* ```typescript
|
|
635
|
+
* task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_REMOVE_FAILED, (task: ITask) => {
|
|
636
|
+
* console.log('Campaign preview remove failed:', task.data.interactionId);
|
|
637
|
+
* // Handle remove failure
|
|
638
|
+
* });
|
|
639
|
+
* ```
|
|
640
|
+
*/
|
|
641
|
+
TASK_EVENTS["TASK_CAMPAIGN_PREVIEW_REMOVE_FAILED"] = "task:campaignPreviewRemoveFailed";
|
|
642
|
+
/**
|
|
643
|
+
* Triggered when a campaign contact is updated (e.g., after skip or remove, when the next contact is offered)
|
|
644
|
+
* @example
|
|
645
|
+
* ```typescript
|
|
646
|
+
* task.on(TASK_EVENTS.TASK_CAMPAIGN_CONTACT_UPDATED, (task: ITask) => {
|
|
647
|
+
* console.log('Campaign contact updated:', task.data.interactionId);
|
|
648
|
+
* // Handle updated campaign contact (e.g., display next contact)
|
|
649
|
+
* });
|
|
650
|
+
* ```
|
|
651
|
+
*/
|
|
652
|
+
TASK_EVENTS["TASK_CAMPAIGN_CONTACT_UPDATED"] = "task:campaignContactUpdated";
|
|
504
653
|
return TASK_EVENTS;
|
|
505
654
|
}({});
|
|
506
655
|
/**
|
|
@@ -509,8 +658,28 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
509
658
|
* @public
|
|
510
659
|
*/
|
|
511
660
|
/**
|
|
512
|
-
*
|
|
513
|
-
*
|
|
661
|
+
* Media entry type from interaction.media
|
|
662
|
+
* Used for media state tracking in consult and conference scenarios
|
|
663
|
+
*/
|
|
664
|
+
/**
|
|
665
|
+
* Task payload mirroring the Agent Contact event payload from Webex Contact Center
|
|
666
|
+
* (developer.webex.com). Arrives on AGENT_* websocket events and is the source of truth
|
|
667
|
+
* for UI/state machine updates.
|
|
668
|
+
* @public
|
|
669
|
+
*/
|
|
670
|
+
/**
|
|
671
|
+
* UI control representation for a single interaction leg.
|
|
672
|
+
*/
|
|
673
|
+
/** Options for {@link ITask.toggleMute} — wxApp engaged calls use `muted` for target state. */
|
|
674
|
+
/** Options for {@link ITask.transmitDtmf} — wxApp engaged in-call DTMF. */
|
|
675
|
+
/**
|
|
676
|
+
* UI controls surfaced to task consumers.
|
|
677
|
+
* Consumers should read controls from the per-leg surfaces and use `activeLeg`
|
|
678
|
+
* to determine which one is currently interactive.
|
|
679
|
+
*/
|
|
680
|
+
/**
|
|
681
|
+
* Helper class for managing task action control state
|
|
682
|
+
* Tracks visibility and enabled state for task actions that can be executed
|
|
514
683
|
* @public
|
|
515
684
|
*/
|
|
516
685
|
/**
|
|
@@ -559,6 +728,10 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
559
728
|
* Parameters for transferring a task to another destination
|
|
560
729
|
* @public
|
|
561
730
|
*/
|
|
731
|
+
/**
|
|
732
|
+
* Options for configuring transfer behavior
|
|
733
|
+
* @public
|
|
734
|
+
*/
|
|
562
735
|
/**
|
|
563
736
|
* API payload for ending a consultation
|
|
564
737
|
* This is the actual payload that is sent to the developer API
|
|
@@ -584,18 +757,83 @@ let TASK_EVENTS = exports.TASK_EVENTS = /*#__PURE__*/function (TASK_EVENTS) {
|
|
|
584
757
|
* Configuration parameters for initiating outbound dialer tasks
|
|
585
758
|
* @public
|
|
586
759
|
*/
|
|
760
|
+
/**
|
|
761
|
+
* Payload for campaign preview contact operations (accept, skip, remove)
|
|
762
|
+
* @public
|
|
763
|
+
*/
|
|
587
764
|
/**
|
|
588
765
|
* Data structure for cleaning up contact resources
|
|
589
766
|
* @public
|
|
590
767
|
*/
|
|
768
|
+
/**
|
|
769
|
+
* Boolean-like fields in callProcessingDetails that may arrive as strings.
|
|
770
|
+
* Used by taskDataNormalizer to coerce payloads to actual booleans.
|
|
771
|
+
*/
|
|
772
|
+
/**
|
|
773
|
+
* Interaction-level boolean fields that may arrive as strings from backend payloads.
|
|
774
|
+
*/
|
|
775
|
+
/**
|
|
776
|
+
* Participant boolean fields that may arrive as strings and need normalization.
|
|
777
|
+
*/
|
|
591
778
|
/**
|
|
592
779
|
* Response type for task public methods
|
|
593
780
|
* Can be an {@link AgentContact} object containing updated task state,
|
|
594
781
|
* an Error in case of failure, or void for operations that don't return data
|
|
595
782
|
* @public
|
|
596
783
|
*/
|
|
784
|
+
/**
|
|
785
|
+
* Request payload for removing a supported participant from an active conference.
|
|
786
|
+
* @public
|
|
787
|
+
*/
|
|
788
|
+
/**
|
|
789
|
+
* Payload shape used by consult conference helper utilities.
|
|
790
|
+
*/
|
|
791
|
+
/**
|
|
792
|
+
* Minimal event-emitter contract exposed to SDK consumers.
|
|
793
|
+
* Defined here so that consumers do NOT need `@types/node` in their tsconfig.
|
|
794
|
+
* The runtime Task class still extends Node's EventEmitter (via ampersand-events),
|
|
795
|
+
* which satisfies this interface at runtime.
|
|
796
|
+
* @public
|
|
797
|
+
*/
|
|
597
798
|
/**
|
|
598
799
|
* Interface for managing task-related operations in the contact center
|
|
599
|
-
* Extends
|
|
800
|
+
* Extends IEventEmitter to support event-driven task updates
|
|
801
|
+
*/
|
|
802
|
+
/**
|
|
803
|
+
* Interface for managing digital channel task operations in the contact center
|
|
804
|
+
* Digital channels (chat, email, social, SMS) have a simpler interface than voice
|
|
805
|
+
* Extends ITask but overrides updateTaskData to return IDigital
|
|
806
|
+
* @public
|
|
807
|
+
*/
|
|
808
|
+
/**
|
|
809
|
+
* Interface for managing voice/telephony task operations in the contact center
|
|
810
|
+
* Extends ITask with voice-specific functionality for hold/resume operations
|
|
811
|
+
* @public
|
|
812
|
+
*/
|
|
813
|
+
/**
|
|
814
|
+
* Configuration options for voice task UI controls
|
|
815
|
+
*/
|
|
816
|
+
/**
|
|
817
|
+
* Participant information for UI display
|
|
818
|
+
*/
|
|
819
|
+
/**
|
|
820
|
+
* @deprecated Use Participant instead
|
|
821
|
+
*/
|
|
822
|
+
/**
|
|
823
|
+
* Actions to be performed after handling an event
|
|
824
|
+
*
|
|
825
|
+
* These actions represent TaskManager-level concerns (task collection lifecycle,
|
|
826
|
+
* resource cleanup) rather than task-level state machine concerns. The separation
|
|
827
|
+
* ensures proper responsibility:
|
|
828
|
+
* - TaskManager: Collection management, metrics, cleanup
|
|
829
|
+
* - State Machine: Task state transitions, event emissions, UI controls
|
|
830
|
+
*/
|
|
831
|
+
/**
|
|
832
|
+
* Context for processing an event
|
|
833
|
+
*
|
|
834
|
+
* Contains all information needed to process a WebSocket event:
|
|
835
|
+
* - Event type and payload from the backend
|
|
836
|
+
* - Task instance (if exists)
|
|
837
|
+
* - Pre-mapped state machine event (if applicable)
|
|
600
838
|
*/
|
|
601
839
|
//# sourceMappingURL=types.js.map
|