@webex/contact-center 3.12.0-llmrefactor.2 → 3.12.0-llmrefactor.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/.sdd/manifest.json +5 -4
  2. package/ai-docs/ARCHITECTURE.md +1 -1
  3. package/ai-docs/CONTRACTS.md +6 -2
  4. package/ai-docs/SECURITY.md +1 -1
  5. package/ai-docs/contact-center-spec.md +22 -4
  6. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  7. package/dist/cc.js +440 -10
  8. package/dist/cc.js.map +1 -1
  9. package/dist/config.js +7 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +10 -2
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/metrics/behavioral-events.js +13 -0
  15. package/dist/metrics/behavioral-events.js.map +1 -1
  16. package/dist/metrics/constants.js +2 -0
  17. package/dist/metrics/constants.js.map +1 -1
  18. package/dist/services/AddressBook.js +18 -15
  19. package/dist/services/AddressBook.js.map +1 -1
  20. package/dist/services/AnswerCallOnWebexService.js +174 -0
  21. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  22. package/dist/services/EntryPoint.js +46 -68
  23. package/dist/services/EntryPoint.js.map +1 -1
  24. package/dist/services/Queue.js +27 -22
  25. package/dist/services/Queue.js.map +1 -1
  26. package/dist/services/WebexCrossClientService.js +171 -0
  27. package/dist/services/WebexCrossClientService.js.map +1 -0
  28. package/dist/services/WxAppTelephonyMercurySync.js +93 -0
  29. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  30. package/dist/services/config/Util.js +3 -0
  31. package/dist/services/config/Util.js.map +1 -1
  32. package/dist/services/config/constants.js +10 -6
  33. package/dist/services/config/constants.js.map +1 -1
  34. package/dist/services/config/types.js +4 -0
  35. package/dist/services/config/types.js.map +1 -1
  36. package/dist/services/core/Err.js.map +1 -1
  37. package/dist/services/core/WebexRequest.js +6 -2
  38. package/dist/services/core/WebexRequest.js.map +1 -1
  39. package/dist/services/core/aqm-reqs.js +28 -14
  40. package/dist/services/core/aqm-reqs.js.map +1 -1
  41. package/dist/services/core/types.js.map +1 -1
  42. package/dist/services/task/Task.js +73 -7
  43. package/dist/services/task/Task.js.map +1 -1
  44. package/dist/services/task/TaskFactory.js +8 -4
  45. package/dist/services/task/TaskFactory.js.map +1 -1
  46. package/dist/services/task/TaskManager.js +353 -21
  47. package/dist/services/task/TaskManager.js.map +1 -1
  48. package/dist/services/task/WebexCallingUtils.js +70 -0
  49. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  50. package/dist/services/task/constants.js +4 -1
  51. package/dist/services/task/constants.js.map +1 -1
  52. package/dist/services/task/contact.js +29 -0
  53. package/dist/services/task/contact.js.map +1 -1
  54. package/dist/services/task/digital/Digital.js +3 -2
  55. package/dist/services/task/digital/Digital.js.map +1 -1
  56. package/dist/services/task/state-machine/TaskStateMachine.js +135 -37
  57. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  58. package/dist/services/task/state-machine/actions.js +6 -1
  59. package/dist/services/task/state-machine/actions.js.map +1 -1
  60. package/dist/services/task/state-machine/guards.js +38 -11
  61. package/dist/services/task/state-machine/guards.js.map +1 -1
  62. package/dist/services/task/state-machine/types.js.map +1 -1
  63. package/dist/services/task/state-machine/uiControlsComputer.js +118 -18
  64. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  65. package/dist/services/task/types.js +16 -1
  66. package/dist/services/task/types.js.map +1 -1
  67. package/dist/services/task/voice/Voice.js +350 -14
  68. package/dist/services/task/voice/Voice.js.map +1 -1
  69. package/dist/services/task/voice/WebRTC.js +4 -1
  70. package/dist/services/task/voice/WebRTC.js.map +1 -1
  71. package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
  72. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  73. package/dist/services/wxAppTelephonyUtils.js +19 -0
  74. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  75. package/dist/types/cc.d.ts +77 -4
  76. package/dist/types/config.d.ts +7 -0
  77. package/dist/types/constants.d.ts +8 -0
  78. package/dist/types/index.d.ts +3 -1
  79. package/dist/types/metrics/constants.d.ts +2 -0
  80. package/dist/types/services/AddressBook.d.ts +2 -1
  81. package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
  82. package/dist/types/services/EntryPoint.d.ts +7 -5
  83. package/dist/types/services/Queue.d.ts +5 -3
  84. package/dist/types/services/WebexCrossClientService.d.ts +28 -0
  85. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  86. package/dist/types/services/config/constants.d.ts +8 -5
  87. package/dist/types/services/config/types.d.ts +17 -4
  88. package/dist/types/services/core/Err.d.ts +2 -0
  89. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  90. package/dist/types/services/core/types.d.ts +2 -0
  91. package/dist/types/services/task/Task.d.ts +20 -2
  92. package/dist/types/services/task/TaskFactory.d.ts +2 -1
  93. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  94. package/dist/types/services/task/constants.d.ts +3 -0
  95. package/dist/types/services/task/contact.d.ts +4 -0
  96. package/dist/types/services/task/digital/Digital.d.ts +2 -2
  97. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +260 -56
  98. package/dist/types/services/task/state-machine/guards.d.ts +6 -5
  99. package/dist/types/services/task/state-machine/types.d.ts +9 -1
  100. package/dist/types/services/task/types.d.ts +81 -4
  101. package/dist/types/services/task/voice/Voice.d.ts +48 -9
  102. package/dist/types/services/task/voice/WebRTC.d.ts +2 -2
  103. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
  104. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  105. package/dist/types/types.d.ts +14 -8
  106. package/dist/types/utils/PageCache.d.ts +20 -3
  107. package/dist/types.js +7 -2
  108. package/dist/types.js.map +1 -1
  109. package/dist/utils/PageCache.js +19 -5
  110. package/dist/utils/PageCache.js.map +1 -1
  111. package/dist/webex.js +1 -1
  112. package/package.json +9 -9
  113. package/src/cc.ts +506 -9
  114. package/src/config.ts +7 -0
  115. package/src/constants.ts +8 -0
  116. package/src/index.ts +2 -0
  117. package/src/metrics/ai-docs/metrics-spec.md +9 -3
  118. package/src/metrics/behavioral-events.ts +14 -0
  119. package/src/metrics/constants.ts +2 -0
  120. package/src/services/AddressBook.ts +17 -6
  121. package/src/services/AnswerCallOnWebexService.ts +206 -0
  122. package/src/services/EntryPoint.ts +59 -60
  123. package/src/services/Queue.ts +29 -12
  124. package/src/services/WebexCrossClientService.ts +212 -0
  125. package/src/services/WxAppTelephonyMercurySync.ts +115 -0
  126. package/src/services/ai-docs/AGENTS.md +10 -10
  127. package/src/services/ai-docs/services-spec.md +6 -1
  128. package/src/services/config/Util.ts +3 -0
  129. package/src/services/config/ai-docs/AGENTS.md +1 -1
  130. package/src/services/config/ai-docs/ARCHITECTURE.md +2 -2
  131. package/src/services/config/ai-docs/config-spec.md +6 -0
  132. package/src/services/config/constants.ts +10 -6
  133. package/src/services/config/types.ts +16 -4
  134. package/src/services/core/Err.ts +1 -0
  135. package/src/services/core/WebexRequest.ts +3 -1
  136. package/src/services/core/ai-docs/core-spec.md +5 -1
  137. package/src/services/core/aqm-reqs.ts +30 -15
  138. package/src/services/core/types.ts +2 -0
  139. package/src/services/task/Task.ts +79 -8
  140. package/src/services/task/TaskFactory.ts +8 -3
  141. package/src/services/task/TaskManager.ts +522 -16
  142. package/src/services/task/WebexCallingUtils.ts +136 -0
  143. package/src/services/task/ai-docs/ARCHITECTURE.md +1 -0
  144. package/src/services/task/ai-docs/task-spec.md +152 -2
  145. package/src/services/task/constants.ts +3 -0
  146. package/src/services/task/contact.ts +30 -0
  147. package/src/services/task/digital/Digital.ts +4 -2
  148. package/src/services/task/state-machine/TaskStateMachine.ts +210 -63
  149. package/src/services/task/state-machine/actions.ts +5 -2
  150. package/src/services/task/state-machine/ai-docs/AGENTS.md +8 -4
  151. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +17 -8
  152. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +56 -24
  153. package/src/services/task/state-machine/guards.ts +64 -11
  154. package/src/services/task/state-machine/types.ts +16 -1
  155. package/src/services/task/state-machine/uiControlsComputer.ts +206 -32
  156. package/src/services/task/types.ts +114 -4
  157. package/src/services/task/voice/Voice.ts +462 -12
  158. package/src/services/task/voice/WebRTC.ts +5 -1
  159. package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
  160. package/src/services/wxAppTelephonyUtils.ts +14 -0
  161. package/src/types.ts +33 -9
  162. package/src/utils/AGENTS.md +21 -10
  163. package/src/utils/PageCache.ts +38 -5
  164. package/src/utils/ai-docs/utils-spec.md +21 -11
  165. package/test/unit/spec/cc.ts +1274 -0
  166. package/test/unit/spec/metrics/behavioral-events.ts +18 -0
  167. package/test/unit/spec/services/AddressBook.ts +37 -6
  168. package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
  169. package/test/unit/spec/services/EntryPoint.ts +87 -40
  170. package/test/unit/spec/services/Queue.ts +123 -12
  171. package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
  172. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
  173. package/test/unit/spec/services/config/Util.ts +85 -0
  174. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  175. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  176. package/test/unit/spec/services/task/Task.ts +200 -0
  177. package/test/unit/spec/services/task/TaskFactory.ts +39 -2
  178. package/test/unit/spec/services/task/TaskManager.ts +1294 -1
  179. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  180. package/test/unit/spec/services/task/contact.ts +33 -0
  181. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +854 -72
  182. package/test/unit/spec/services/task/state-machine/guards.ts +210 -8
  183. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +445 -7
  184. package/test/unit/spec/services/task/voice/Voice.ts +874 -0
  185. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -0
  186. package/umd/contact-center.min.js +2 -2
  187. package/umd/contact-center.min.js.map +1 -1
@@ -7,8 +7,11 @@ exports.computeUIControls = computeUIControls;
7
7
  exports.getDefaultUIControls = getDefaultUIControls;
8
8
  exports.haveUIControlsChanged = haveUIControlsChanged;
9
9
  var _types = require("../types");
10
+ var _WebexCallingUtils = require("../WebexCallingUtils");
10
11
  var _constants = require("./constants");
11
12
  var _TaskUtils = require("../TaskUtils");
13
+ var _constants2 = require("../../../constants");
14
+ var _constants3 = require("../../config/constants");
12
15
  /**
13
16
  * UI Controls Computer - Centralized logic for computing UI control states
14
17
  */
@@ -25,6 +28,25 @@ const VISIBLE_DISABLED = {
25
28
  isVisible: true,
26
29
  isEnabled: false
27
30
  };
31
+
32
+ /** wxApp telephony controls live on the main leg only (mute/keypad via wxApp APIs). */
33
+ function withWxAppTelephonyControls(controls, isWxAppEngaged, currentLeg, isWrappingUp) {
34
+ if (!isWxAppEngaged || isWrappingUp) {
35
+ return controls;
36
+ }
37
+ if (currentLeg === 'main') {
38
+ return {
39
+ ...controls,
40
+ mute: VISIBLE_ENABLED,
41
+ keypad: VISIBLE_ENABLED
42
+ };
43
+ }
44
+ return {
45
+ ...controls,
46
+ mute: DISABLED,
47
+ keypad: DISABLED
48
+ };
49
+ }
28
50
  function getDefaultInteractionUIControls() {
29
51
  return {
30
52
  accept: DISABLED,
@@ -42,19 +64,59 @@ function getDefaultInteractionUIControls() {
42
64
  exitConference: DISABLED,
43
65
  transferConference: DISABLED,
44
66
  mergeToConference: DISABLED,
45
- switch: DISABLED
67
+ switch: DISABLED,
68
+ keypad: DISABLED
46
69
  };
47
70
  }
48
- function createTaskUIControls(main, consult, activeLeg) {
71
+ function createTaskUIControls(main, consult, activeLeg, consultTransferDestinations = {
72
+ consult: [],
73
+ transfer: []
74
+ }) {
49
75
  return {
50
76
  main,
51
77
  consult,
52
- activeLeg
78
+ activeLeg,
79
+ consultTransferDestinations
53
80
  };
54
81
  }
55
82
  function getDefaultUIControls() {
56
83
  return createTaskUIControls(getDefaultInteractionUIControls(), getDefaultInteractionUIControls(), 'main');
57
84
  }
85
+ function getConsultTransferDestinations(config, taskData) {
86
+ const destinationConfig = config.consultTransferConfig;
87
+ if (!destinationConfig) {
88
+ return {
89
+ consult: [],
90
+ transfer: []
91
+ };
92
+ }
93
+ const isVoice = config.channelType === _types.TASK_CHANNEL_TYPE.VOICE;
94
+ const interaction = taskData?.interaction;
95
+ const direction = interaction?.contactDirection?.type?.toUpperCase();
96
+ const destinations = {
97
+ consult: [],
98
+ transfer: []
99
+ };
100
+ if (destinationConfig.accessBuddyTeam?.toUpperCase() !== _constants3.COLLABORATION_ACCESS.NONE) {
101
+ destinations.consult.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.AGENT);
102
+ destinations.transfer.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.AGENT);
103
+ }
104
+ if (destinationConfig.accessQueue?.toUpperCase() !== _constants3.COLLABORATION_ACCESS.NONE) {
105
+ const canConsultQueue = !isVoice || destinationConfig.allowConsultToQueue;
106
+ const canTransferQueue = !isVoice || direction === _constants2.INBOUND_DIRECTION || direction === _constants2.OUTDIAL_DIRECTION && interaction?.callProcessingDetails?.outdialTransferToQueueEnabled === true;
107
+ if (canConsultQueue) destinations.consult.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.QUEUE);
108
+ if (canTransferQueue) destinations.transfer.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.QUEUE);
109
+ }
110
+ if (isVoice) {
111
+ destinations.consult.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER);
112
+ destinations.transfer.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER);
113
+ if (destinationConfig.accessEntryPoint?.toUpperCase() !== _constants3.COLLABORATION_ACCESS.NONE) {
114
+ destinations.consult.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT);
115
+ destinations.transfer.push(_types.CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT);
116
+ }
117
+ }
118
+ return destinations;
119
+ }
58
120
 
59
121
  /** Consult media must exist on the interaction payload, not only as a stale resource id. */
60
122
  function hasConsultMediaInInteraction(interaction, consultMediaResourceId) {
@@ -90,6 +152,15 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
90
152
  const participantCount = interaction && mainCallId ? (0, _TaskUtils.getConferenceParticipantsCount)(interaction, mainCallId) : 0;
91
153
  const maxParticipants = participantCount >= _constants.MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE;
92
154
  const selfAgentId = config.agentId ?? taskData?.agentId;
155
+ const enableWxBetterTogether = config.enableWxBetterTogether ?? false;
156
+ const wxAppDeviceDetails = enableWxBetterTogether ? (0, _WebexCallingUtils.getWebexCallingDeviceDetailsForAgent)(selfAgentId, interaction?.participants) : undefined;
157
+ const isWxAppParticipant = enableWxBetterTogether && wxAppDeviceDetails?.deviceType === 'wxApp';
158
+ const isWxAppOffer = isWxAppParticipant && Boolean(wxAppDeviceDetails) && state === _constants.TaskState.OFFERED;
159
+ const isWxAppInboundOffer = isWxAppOffer && !isOutdial;
160
+ const isWxAppOutdialOffer = isWxAppOffer && isOutdial;
161
+ const wxAppAnswerPending = config.wxAppAnswerPending ?? false;
162
+ const wxAppAcceptInFlight = config.wxAppAcceptInFlight ?? false;
163
+ const isWxAppEngaged = (0, _WebexCallingUtils.isWxAppEngagedForControls)(enableWxBetterTogether, selfAgentId, interaction?.participants, state);
93
164
  const consultInProgress = (0, _TaskUtils.getIsConsultInProgressForConferenceControls)(interaction, mainCallId, selfAgentId);
94
165
  const conferenceFromBackend = taskData ? (0, _TaskUtils.getIsConferenceInProgress)(taskData) : false;
95
166
  // Note: ownership is used by some controls; keep computations local to those controls
@@ -190,33 +261,33 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
190
261
  const shouldHideBlindTransferForEpDnPendingConferenceMerge = isEpDnPendingConferenceMergeUi;
191
262
  if (isConsultUnansweredFailure) {
192
263
  const recordingControl = recordingControlsAvailable && config.isRecordingEnabled && !inConference ? VISIBLE_ENABLED : DISABLED;
193
- return {
264
+ return withWxAppTelephonyControls({
194
265
  ...getDefaultInteractionUIControls(),
195
266
  hold: VISIBLE_ENABLED,
196
267
  transfer: VISIBLE_ENABLED,
197
268
  consult: VISIBLE_ENABLED,
198
269
  recording: recordingControl,
199
270
  end: VISIBLE_DISABLED
200
- };
271
+ }, isWxAppEngaged, currentLeg, isWrappingUp);
201
272
  }
202
273
  if (isConsultRequestedPhase && !isEpDnPendingConferenceMergeUi) {
203
274
  if (currentLeg === 'main') {
204
- return {
275
+ return withWxAppTelephonyControls({
205
276
  ...getDefaultInteractionUIControls(),
206
277
  transfer: shouldHideBlindTransferForEpDnPendingConferenceMerge ? DISABLED : VISIBLE_DISABLED,
207
278
  conference: VISIBLE_DISABLED,
208
279
  end: VISIBLE_DISABLED
209
- };
280
+ }, isWxAppEngaged, currentLeg, isWrappingUp);
210
281
  }
211
282
  if (currentLeg === 'consult') {
212
- return {
283
+ return withWxAppTelephonyControls({
213
284
  ...getDefaultInteractionUIControls(),
214
285
  endConsult: VISIBLE_ENABLED,
215
286
  switch: VISIBLE_DISABLED,
216
287
  transfer: VISIBLE_DISABLED,
217
288
  transferConference: inConference ? VISIBLE_DISABLED : DISABLED,
218
289
  mergeToConference: VISIBLE_DISABLED
219
- };
290
+ }, isWxAppEngaged, currentLeg, isWrappingUp);
220
291
  }
221
292
  }
222
293
  return {
@@ -224,11 +295,26 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
224
295
  // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)
225
296
  // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show "Accept" disabled)
226
297
  // Extension mode (non-WebRTC): accept disabled (Widgets show "Ringing...")
227
- accept: state === _constants.TaskState.OFFERED && !interaction?.isTerminated ? {
228
- isVisible: true,
229
- isEnabled: isWebrtc && !isOutdial
230
- } : DISABLED,
298
+ accept: (() => {
299
+ if (isWxAppInboundOffer) {
300
+ return wxAppAcceptInFlight || wxAppAnswerPending ? VISIBLE_DISABLED : VISIBLE_ENABLED;
301
+ }
302
+ if (isWxAppOutdialOffer) {
303
+ return wxAppAcceptInFlight || wxAppAnswerPending ? VISIBLE_DISABLED : VISIBLE_ENABLED;
304
+ }
305
+ if (state === _constants.TaskState.OFFERED && !interaction?.isTerminated) {
306
+ return {
307
+ isVisible: true,
308
+ isEnabled: isWebrtc && !isOutdial
309
+ };
310
+ }
311
+ return DISABLED;
312
+ })(),
231
313
  decline: (() => {
314
+ if (wxAppAcceptInFlight) return VISIBLE_DISABLED;
315
+ if (wxAppAnswerPending && isWxAppInboundOffer) return VISIBLE_DISABLED;
316
+ if (isWxAppInboundOffer) return VISIBLE_ENABLED;
317
+ if (isWxAppOutdialOffer) return VISIBLE_ENABLED;
232
318
  if (!isWebrtc || state !== _constants.TaskState.OFFERED || interaction?.isTerminated) return DISABLED;
233
319
  return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;
234
320
  })(),
@@ -249,8 +335,11 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
249
335
  const canHold = (isConnected || isHeld) && !inConference && !isConsulting;
250
336
  return canHold ? VISIBLE_ENABLED : VISIBLE_DISABLED;
251
337
  })(),
252
- // Mute: WebRTC only, active calls; hidden entirely during wrapup
338
+ // Mute: WebRTC or wxApp engaged calls; hidden entirely during wrapup
253
339
  mute: (() => {
340
+ if (isWxAppEngaged && !isWrappingUp) {
341
+ return currentLeg === 'main' ? VISIBLE_ENABLED : DISABLED;
342
+ }
254
343
  if (!isWebrtc) return DISABLED;
255
344
  if (isWrappingUp) return DISABLED;
256
345
  if (isEpDnPostCallCustomerLeft && inConference) return VISIBLE_DISABLED;
@@ -462,6 +551,12 @@ function computeVoiceInteractionUIControls(state, context, config, fallbackTaskD
462
551
  return isConsultDestinationReady ? VISIBLE_ENABLED : VISIBLE_DISABLED;
463
552
  }
464
553
  return DISABLED;
554
+ })(),
555
+ keypad: (() => {
556
+ if (isWxAppEngaged && !isWrappingUp) {
557
+ return currentLeg === 'main' ? VISIBLE_ENABLED : DISABLED;
558
+ }
559
+ return DISABLED;
465
560
  })()
466
561
  };
467
562
  }
@@ -486,7 +581,8 @@ function computeDigitalInteractionUIControls(state, context, fallbackTaskData) {
486
581
  exitConference: DISABLED,
487
582
  transferConference: DISABLED,
488
583
  mergeToConference: DISABLED,
489
- switch: DISABLED
584
+ switch: DISABLED,
585
+ keypad: DISABLED
490
586
  };
491
587
  }
492
588
  function getVoiceLegState(currentState, context, config, fallbackTaskData) {
@@ -570,6 +666,7 @@ function computeUIControls(currentState, context, fallbackTaskData) {
570
666
  if (currentState === _constants.TaskState.TERMINATED || currentState === _constants.TaskState.COMPLETED) {
571
667
  return getDefaultUIControls();
572
668
  }
669
+ const consultTransferDestinations = getConsultTransferDestinations(context.uiControlConfig, fallbackTaskData ?? context.taskData);
573
670
  switch (context.uiControlConfig.channelType) {
574
671
  case _types.TASK_CHANNEL_TYPE.VOICE:
575
672
  {
@@ -581,10 +678,10 @@ function computeUIControls(currentState, context, fallbackTaskData) {
581
678
  } = getVoiceLegState(currentState, context, context.uiControlConfig, fallbackTaskData);
582
679
  const mainControls = computeVoiceInteractionUIControls(mainState, context, context.uiControlConfig, fallbackTaskData, 'main');
583
680
  const consultControls = hasConsultLeg ? computeVoiceInteractionUIControls(consultState, context, context.uiControlConfig, fallbackTaskData, 'consult') : getDefaultInteractionUIControls();
584
- return createTaskUIControls(mainControls, consultControls, activeLeg);
681
+ return createTaskUIControls(mainControls, consultControls, activeLeg, consultTransferDestinations);
585
682
  }
586
683
  case _types.TASK_CHANNEL_TYPE.DIGITAL:
587
- return createTaskUIControls(computeDigitalInteractionUIControls(currentState, context, fallbackTaskData), getDefaultInteractionUIControls(), 'main');
684
+ return createTaskUIControls(computeDigitalInteractionUIControls(currentState, context, fallbackTaskData), getDefaultInteractionUIControls(), 'main', consultTransferDestinations);
588
685
  default:
589
686
  return getDefaultUIControls();
590
687
  }
@@ -596,8 +693,11 @@ function haveInteractionUIControlsChanged(previous, next) {
596
693
  return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;
597
694
  });
598
695
  }
696
+ function haveDestinationListChanged(previous, next) {
697
+ return previous.length !== next.length || previous.some((destination, index) => destination !== next[index]);
698
+ }
599
699
  function haveUIControlsChanged(previous, next) {
600
700
  if (!previous) return true;
601
- return previous.activeLeg !== next.activeLeg || haveInteractionUIControlsChanged(previous.main, next.main) || haveInteractionUIControlsChanged(previous.consult, next.consult);
701
+ return previous.activeLeg !== next.activeLeg || haveDestinationListChanged(previous.consultTransferDestinations.consult, next.consultTransferDestinations.consult) || haveDestinationListChanged(previous.consultTransferDestinations.transfer, next.consultTransferDestinations.transfer) || haveInteractionUIControlsChanged(previous.main, next.main) || haveInteractionUIControlsChanged(previous.consult, next.consult);
602
702
  }
603
703
  //# sourceMappingURL=uiControlsComputer.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_constants","_TaskUtils","DISABLED","isVisible","isEnabled","VISIBLE_ENABLED","VISIBLE_DISABLED","getDefaultInteractionUIControls","accept","decline","hold","mute","end","transfer","consult","consultTransfer","endConsult","recording","conference","wrapup","exitConference","transferConference","mergeToConference","switch","createTaskUIControls","main","activeLeg","getDefaultUIControls","hasConsultMediaInInteraction","interaction","consultMediaResourceId","media","hasConsultLeg","Object","values","some","entry","mType","Boolean","isSelfActiveConsultInitiator","consultInitiator","selfAgentId","selfParticipant","selfInConsultCall","consultingAgentId","consultState","computeVoiceInteractionUIControls","state","context","config","fallbackTaskData","currentLeg","TaskState","IDLE","taskData","mainCallId","mainInteractionId","interactionId","isWebrtc","voiceVariant","VOICE_VARIANT","WEBRTC","isOutdial","outboundType","serverHold","getServerHoldStateForControls","customerInCall","getIsCustomerInCall","customerPresent","participants","p","pType","hasLeft","participantCount","getConferenceParticipantsCount","maxParticipants","MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE","agentId","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","isWrappingUp","WRAPPING_UP","selfInMainCall","includes","consultMedia","find","mediaResourceId","hasConsultMedia","isSecondaryConsultRejectedWhileEpDnActive","type","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","undefined","otherAgentConsultInProgress","participant","id","String","toUpperCase","currentState","isHydratedConferenceConsultPending","hasParallelConsultLeg","activeLegForConferenceConsult","isCurrentLegActive","isConferenceConsultTransferContext","consultLegOnHold","callProcessingDetails","conferenceHoldParticipant","postDeclineHeldMainLeg","postConsultCompletedHeldMainLeg","nonOwnerPostConsultCompletedHeldMainLeg","isConsultPendingBeforeJoin","hideExitConferenceWhileConsultPending","hideExitConferenceDuringActiveConsultFromConference","hideExitConferenceOnMainLegForEpDnConsultFromConference","forceHeldPostConsultControls","selfOnConsultLeg","showMainLegConferenceControlsDuringConsult","allowHeldMainLegControlsForNonInitiator","isConsultRequestedPhase","isConsultUnansweredFailure","shouldHideBlindTransferForEpDnPendingConferenceMerge","recordingControl","isRecordingEnabled","OFFERED","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","channelType","TASK_CHANNEL_TYPE","VOICE","mainControls","consultControls","DIGITAL","haveInteractionUIControlsChanged","previous","next","keys","key","prev","curr","haveUIControlsChanged"],"sources":["uiControlsComputer.ts"],"sourcesContent":["/**\n * UI Controls Computer - Centralized logic for computing UI control states\n */\n\nimport {\n InteractionUIControls,\n TASK_CHANNEL_TYPE,\n TaskData,\n TaskUILeg,\n TaskUIControls,\n VOICE_VARIANT,\n} from '../types';\nimport {TaskContext, UIControlConfig} from './types';\nimport {TaskState, MAX_PARTICIPANTS_IN_MULTIPARTY_CONFERENCE, INTERACTION_STATE} from './constants';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n getIsConsultInProgressForConferenceControls,\n getIsConsultedAgentForControls,\n getServerHoldStateForControls,\n} from '../TaskUtils';\n\nconst DISABLED = {isVisible: false, isEnabled: false} as const;\nconst VISIBLE_ENABLED = {isVisible: true, isEnabled: true} as const;\nconst VISIBLE_DISABLED = {isVisible: true, isEnabled: false} as const;\n\nfunction getDefaultInteractionUIControls(): InteractionUIControls {\n return {\n accept: DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: DISABLED,\n transfer: DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction createTaskUIControls(\n main: InteractionUIControls,\n consult: InteractionUIControls,\n activeLeg: TaskUILeg\n): TaskUIControls {\n return {\n main,\n consult,\n activeLeg,\n };\n}\n\nexport function getDefaultUIControls(): TaskUIControls {\n return createTaskUIControls(\n getDefaultInteractionUIControls(),\n getDefaultInteractionUIControls(),\n 'main'\n );\n}\n\n/** Consult media must exist on the interaction payload, not only as a stale resource id. */\nfunction hasConsultMediaInInteraction(\n interaction: TaskData['interaction'] | undefined,\n consultMediaResourceId?: string\n): boolean {\n const media = interaction?.media ?? {};\n const hasConsultLeg = Object.values(media).some((entry: any) => entry?.mType === 'consult');\n\n if (hasConsultLeg) return true;\n if (!consultMediaResourceId) return false;\n\n return Boolean(media[consultMediaResourceId]);\n}\n\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 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 {\n ...getDefaultInteractionUIControls(),\n hold: VISIBLE_ENABLED,\n transfer: VISIBLE_ENABLED,\n consult: VISIBLE_ENABLED,\n recording: recordingControl,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (isConsultRequestedPhase && !isEpDnPendingConferenceMergeUi) {\n if (currentLeg === 'main') {\n return {\n ...getDefaultInteractionUIControls(),\n transfer: shouldHideBlindTransferForEpDnPendingConferenceMerge\n ? DISABLED\n : VISIBLE_DISABLED,\n conference: VISIBLE_DISABLED,\n end: VISIBLE_DISABLED,\n };\n }\n\n if (currentLeg === 'consult') {\n return {\n ...getDefaultInteractionUIControls(),\n endConsult: VISIBLE_ENABLED,\n switch: VISIBLE_DISABLED,\n transfer: VISIBLE_DISABLED,\n transferConference: inConference ? VISIBLE_DISABLED : DISABLED,\n mergeToConference: VISIBLE_DISABLED,\n };\n }\n }\n\n return {\n // Accept/Decline: Voice tasks in offered state\n // Desktop/WebRTC + inbound: accept enabled (agent manually accepts)\n // Desktop/WebRTC + outdial: accept disabled (auto-answer handles it; Widgets show \"Accept\" disabled)\n // Extension mode (non-WebRTC): accept disabled (Widgets show \"Ringing...\")\n accept:\n state === TaskState.OFFERED && !interaction?.isTerminated\n ? {isVisible: true, isEnabled: isWebrtc && !isOutdial}\n : DISABLED,\n decline: (() => {\n if (!isWebrtc || state !== TaskState.OFFERED || interaction?.isTerminated) return DISABLED;\n\n return isOutdial ? VISIBLE_DISABLED : VISIBLE_ENABLED;\n })(),\n\n // Hold: visible in connected/held/conference, disabled in conference/consulting\n hold: (() => {\n if (!hasFullControls) return DISABLED;\n if (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 only, active calls; hidden entirely during wrapup\n mute: (() => {\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}\n\nfunction computeDigitalInteractionUIControls(\n state: TaskState,\n context: TaskContext,\n fallbackTaskData?: TaskData\n): InteractionUIControls {\n const taskData = context.taskData ?? fallbackTaskData ?? null;\n const isTerminated = taskData?.interaction?.isTerminated ?? false;\n\n const isConnected = state === TaskState.CONNECTED;\n const isWrappingUp = state === TaskState.WRAPPING_UP;\n\n return {\n accept: state === TaskState.OFFERED ? VISIBLE_ENABLED : DISABLED,\n decline: DISABLED,\n hold: DISABLED,\n mute: DISABLED,\n end: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n transfer: isConnected && !isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n consult: DISABLED,\n consultTransfer: DISABLED,\n endConsult: DISABLED,\n recording: DISABLED,\n conference: DISABLED,\n wrapup: isTerminated || isWrappingUp ? VISIBLE_ENABLED : DISABLED,\n exitConference: DISABLED,\n transferConference: DISABLED,\n mergeToConference: DISABLED,\n switch: DISABLED,\n };\n}\n\nfunction getVoiceLegState(\n currentState: TaskState,\n context: TaskContext,\n config: UIControlConfig,\n fallbackTaskData?: TaskData\n): {hasConsultLeg: boolean; activeLeg: TaskUILeg; mainState: TaskState; consultState: TaskState} {\n if (currentState === TaskState.WRAPPING_UP) {\n return {\n hasConsultLeg: false,\n activeLeg: 'main',\n mainState: currentState,\n consultState: TaskState.CONSULTING,\n };\n }\n\n const taskData = fallbackTaskData ?? context.taskData ?? null;\n const interaction = taskData?.interaction;\n const mainCallId = interaction?.mainInteractionId || taskData?.interactionId;\n const selfAgentId = config.agentId ?? taskData?.agentId;\n\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 switch (context.uiControlConfig.channelType) {\n case TASK_CHANNEL_TYPE.VOICE: {\n const {hasConsultLeg, activeLeg, mainState, consultState} = getVoiceLegState(\n currentState,\n context,\n context.uiControlConfig,\n fallbackTaskData\n );\n\n const mainControls = computeVoiceInteractionUIControls(\n mainState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'main'\n );\n const consultControls = hasConsultLeg\n ? computeVoiceInteractionUIControls(\n consultState,\n context,\n context.uiControlConfig,\n fallbackTaskData,\n 'consult'\n )\n : getDefaultInteractionUIControls();\n\n return createTaskUIControls(mainControls, consultControls, activeLeg);\n }\n case TASK_CHANNEL_TYPE.DIGITAL:\n return createTaskUIControls(\n computeDigitalInteractionUIControls(currentState, context, fallbackTaskData),\n getDefaultInteractionUIControls(),\n 'main'\n );\n default:\n return getDefaultUIControls();\n }\n}\n\nfunction haveInteractionUIControlsChanged(\n previous: InteractionUIControls,\n next: InteractionUIControls\n): boolean {\n return (Object.keys(next) as (keyof InteractionUIControls)[]).some((key) => {\n const prev = previous[key];\n const curr = next[key];\n\n return prev.isVisible !== curr.isVisible || prev.isEnabled !== curr.isEnabled;\n });\n}\n\nexport function haveUIControlsChanged(\n previous: TaskUIControls | undefined,\n next: TaskUIControls\n): boolean {\n if (!previous) return true;\n\n return (\n previous.activeLeg !== next.activeLeg ||\n haveInteractionUIControlsChanged(previous.main, next.main) ||\n haveInteractionUIControlsChanged(previous.consult, next.consult)\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_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":"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","ignoreList":[]}