@webex/contact-center 3.12.0-next.13 → 3.12.0-next.130

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 (312) hide show
  1. package/.sdd/manifest.json +884 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +53 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +52 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +382 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  19. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  20. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  21. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  22. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  23. package/ai-docs/patterns/testing-patterns.md +480 -0
  24. package/ai-docs/patterns/typescript-patterns.md +365 -0
  25. package/ai-docs/templates/README.md +102 -0
  26. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  27. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  28. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  29. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  30. package/ai-docs/templates/new-method/00-master.md +80 -0
  31. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  32. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  33. package/ai-docs/templates/new-method/03-tests.md +201 -0
  34. package/ai-docs/templates/new-method/04-validation.md +141 -0
  35. package/ai-docs/templates/new-service/00-master.md +109 -0
  36. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  37. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  38. package/ai-docs/templates/new-service/03-integration.md +178 -0
  39. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  40. package/ai-docs/templates/new-service/05-validation.md +145 -0
  41. package/dist/cc.js +971 -42
  42. package/dist/cc.js.map +1 -1
  43. package/dist/config.js +13 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.js +31 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +45 -15
  48. package/dist/index.js.map +1 -1
  49. package/dist/metrics/MetricsManager.js +16 -0
  50. package/dist/metrics/MetricsManager.js.map +1 -1
  51. package/dist/metrics/behavioral-events.js +205 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +48 -4
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/services/AddressBook.js +18 -15
  56. package/dist/services/AddressBook.js.map +1 -1
  57. package/dist/services/AnswerCallOnWebexService.js +202 -0
  58. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  59. package/dist/services/ApiAiAssistant.js +269 -9
  60. package/dist/services/ApiAiAssistant.js.map +1 -1
  61. package/dist/services/EntryPoint.js +46 -68
  62. package/dist/services/EntryPoint.js.map +1 -1
  63. package/dist/services/Queue.js +27 -22
  64. package/dist/services/Queue.js.map +1 -1
  65. package/dist/services/UserPreference.js +427 -0
  66. package/dist/services/UserPreference.js.map +1 -0
  67. package/dist/services/WebexCrossClientService.js +222 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +11 -4
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +41 -7
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +51 -0
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +57 -12
  78. package/dist/services/config/types.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +111 -32
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +28 -14
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/types.js.map +1 -1
  90. package/dist/services/index.js +1 -1
  91. package/dist/services/index.js.map +1 -1
  92. package/dist/services/task/Task.js +754 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +49 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1172 -521
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +211 -27
  99. package/dist/services/task/TaskUtils.js.map +1 -1
  100. package/dist/services/task/WebexCallingUtils.js +70 -0
  101. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  102. package/dist/services/task/constants.js +12 -2
  103. package/dist/services/task/constants.js.map +1 -1
  104. package/dist/services/task/contact.js +29 -0
  105. package/dist/services/task/contact.js.map +1 -1
  106. package/dist/services/task/dialer.js +78 -0
  107. package/dist/services/task/dialer.js.map +1 -1
  108. package/dist/services/task/digital/Digital.js +78 -0
  109. package/dist/services/task/digital/Digital.js.map +1 -0
  110. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  111. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  112. package/dist/services/task/state-machine/actions.js +572 -0
  113. package/dist/services/task/state-machine/actions.js.map +1 -0
  114. package/dist/services/task/state-machine/constants.js +161 -0
  115. package/dist/services/task/state-machine/constants.js.map +1 -0
  116. package/dist/services/task/state-machine/guards.js +379 -0
  117. package/dist/services/task/state-machine/guards.js.map +1 -0
  118. package/dist/services/task/state-machine/index.js +53 -0
  119. package/dist/services/task/state-machine/index.js.map +1 -0
  120. package/dist/services/task/state-machine/types.js +54 -0
  121. package/dist/services/task/state-machine/types.js.map +1 -0
  122. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  123. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  124. package/dist/services/task/taskDataNormalizer.js +99 -0
  125. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  126. package/dist/services/task/types.js +228 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1485 -0
  129. package/dist/services/task/voice/Voice.js.map +1 -0
  130. package/dist/services/task/voice/WebRTC.js +152 -0
  131. package/dist/services/task/voice/WebRTC.js.map +1 -0
  132. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  133. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  134. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  135. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  136. package/dist/services/wxAppTelephonyUtils.js +19 -0
  137. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  138. package/dist/types/cc.d.ts +193 -6
  139. package/dist/types/config.d.ts +13 -0
  140. package/dist/types/constants.d.ts +29 -1
  141. package/dist/types/index.d.ts +35 -8
  142. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  143. package/dist/types/metrics/constants.d.ts +43 -1
  144. package/dist/types/services/AddressBook.d.ts +2 -1
  145. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  146. package/dist/types/services/ApiAiAssistant.d.ts +56 -5
  147. package/dist/types/services/EntryPoint.d.ts +7 -5
  148. package/dist/types/services/Queue.d.ts +5 -3
  149. package/dist/types/services/UserPreference.d.ts +118 -0
  150. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  151. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  152. package/dist/types/services/config/constants.d.ts +34 -5
  153. package/dist/types/services/config/types.d.ts +197 -12
  154. package/dist/types/services/core/Err.d.ts +6 -0
  155. package/dist/types/services/core/Utils.d.ts +35 -13
  156. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  157. package/dist/types/services/core/types.d.ts +2 -0
  158. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  159. package/dist/types/services/core/websocket/types.d.ts +1 -1
  160. package/dist/types/services/index.d.ts +1 -1
  161. package/dist/types/services/task/Task.d.ts +175 -0
  162. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  163. package/dist/types/services/task/TaskUtils.d.ts +48 -2
  164. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  165. package/dist/types/services/task/constants.d.ts +10 -0
  166. package/dist/types/services/task/contact.d.ts +4 -0
  167. package/dist/types/services/task/dialer.d.ts +30 -0
  168. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  169. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  170. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  171. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  172. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  173. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  174. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  175. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  176. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  177. package/dist/types/services/task/types.d.ts +680 -66
  178. package/dist/types/services/task/voice/Voice.d.ts +227 -0
  179. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  180. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  181. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  182. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  183. package/dist/types/types.d.ts +205 -9
  184. package/dist/types/utils/PageCache.d.ts +20 -3
  185. package/dist/types/webex.d.ts +1 -0
  186. package/dist/types.js +162 -4
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/PageCache.js +19 -5
  189. package/dist/utils/PageCache.js.map +1 -1
  190. package/dist/webex.js +22 -2
  191. package/dist/webex.js.map +1 -1
  192. package/package.json +16 -12
  193. package/src/cc.ts +1289 -112
  194. package/src/config.ts +13 -0
  195. package/src/constants.ts +29 -1
  196. package/src/index.ts +36 -5
  197. package/src/metrics/MetricsManager.ts +16 -0
  198. package/src/metrics/ai-docs/AGENTS.md +350 -0
  199. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  200. package/src/metrics/ai-docs/metrics-spec.md +921 -0
  201. package/src/metrics/behavioral-events.ts +212 -0
  202. package/src/metrics/constants.ts +52 -4
  203. package/src/services/AddressBook.ts +17 -6
  204. package/src/services/AnswerCallOnWebexService.ts +239 -0
  205. package/src/services/ApiAiAssistant.ts +356 -9
  206. package/src/services/EntryPoint.ts +59 -60
  207. package/src/services/Queue.ts +29 -12
  208. package/src/services/UserPreference.ts +509 -0
  209. package/src/services/WebexCrossClientService.ts +293 -0
  210. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  211. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  212. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  213. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  214. package/src/services/ai-docs/AGENTS.md +386 -0
  215. package/src/services/ai-docs/services-spec.md +505 -0
  216. package/src/services/config/Util.ts +12 -3
  217. package/src/services/config/ai-docs/AGENTS.md +255 -0
  218. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  219. package/src/services/config/ai-docs/config-spec.md +686 -0
  220. package/src/services/config/constants.ts +46 -6
  221. package/src/services/config/index.ts +65 -0
  222. package/src/services/config/types.ts +197 -13
  223. package/src/services/core/Err.ts +3 -0
  224. package/src/services/core/Utils.ts +127 -37
  225. package/src/services/core/WebexRequest.ts +3 -1
  226. package/src/services/core/ai-docs/AGENTS.md +381 -0
  227. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  228. package/src/services/core/ai-docs/core-spec.md +787 -0
  229. package/src/services/core/aqm-reqs.ts +30 -15
  230. package/src/services/core/types.ts +2 -0
  231. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  232. package/src/services/core/websocket/types.ts +1 -1
  233. package/src/services/index.ts +1 -1
  234. package/src/services/task/Task.ts +908 -0
  235. package/src/services/task/TaskFactory.ts +60 -0
  236. package/src/services/task/TaskManager.ts +1419 -608
  237. package/src/services/task/TaskUtils.ts +303 -25
  238. package/src/services/task/WebexCallingUtils.ts +136 -0
  239. package/src/services/task/ai-docs/AGENTS.md +457 -0
  240. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  241. package/src/services/task/ai-docs/task-spec.md +1474 -0
  242. package/src/services/task/constants.ts +10 -0
  243. package/src/services/task/contact.ts +30 -0
  244. package/src/services/task/dialer.ts +80 -0
  245. package/src/services/task/digital/Digital.ts +97 -0
  246. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  247. package/src/services/task/state-machine/actions.ts +741 -0
  248. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  249. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  250. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  251. package/src/services/task/state-machine/constants.ts +172 -0
  252. package/src/services/task/state-machine/guards.ts +442 -0
  253. package/src/services/task/state-machine/index.ts +28 -0
  254. package/src/services/task/state-machine/types.ts +258 -0
  255. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  256. package/src/services/task/taskDataNormalizer.ts +137 -0
  257. package/src/services/task/types.ts +819 -70
  258. package/src/services/task/voice/Voice.ts +1851 -0
  259. package/src/services/task/voice/WebRTC.ts +191 -0
  260. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  261. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  262. package/src/services/wxAppTelephonyUtils.ts +14 -0
  263. package/src/types.ts +262 -11
  264. package/src/utils/AGENTS.md +289 -0
  265. package/src/utils/PageCache.ts +38 -5
  266. package/src/utils/ai-docs/utils-spec.md +391 -0
  267. package/src/webex.js +10 -0
  268. package/test/unit/spec/cc.ts +2210 -119
  269. package/test/unit/spec/logger-proxy.ts +70 -0
  270. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  271. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  272. package/test/unit/spec/services/AddressBook.ts +37 -6
  273. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  274. package/test/unit/spec/services/ApiAiAssistant.ts +311 -21
  275. package/test/unit/spec/services/EntryPoint.ts +87 -40
  276. package/test/unit/spec/services/Queue.ts +123 -12
  277. package/test/unit/spec/services/UserPreference.ts +401 -0
  278. package/test/unit/spec/services/WebCallingService.ts +7 -1
  279. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  280. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  281. package/test/unit/spec/services/config/Util.ts +129 -0
  282. package/test/unit/spec/services/config/index.ts +97 -29
  283. package/test/unit/spec/services/core/Utils.ts +425 -8
  284. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  285. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  286. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  287. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  288. package/test/unit/spec/services/task/Task.ts +745 -0
  289. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  290. package/test/unit/spec/services/task/TaskManager.ts +2518 -1494
  291. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  292. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  293. package/test/unit/spec/services/task/contact.ts +33 -0
  294. package/test/unit/spec/services/task/dialer.ts +190 -0
  295. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  296. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  297. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  298. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  299. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  300. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  301. package/test/unit/spec/services/task/voice/Voice.ts +2061 -0
  302. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  303. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  304. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  305. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  306. package/umd/contact-center.min.js +2 -2
  307. package/umd/contact-center.min.js.map +1 -1
  308. package/dist/services/task/index.js +0 -1525
  309. package/dist/services/task/index.js.map +0 -1
  310. package/dist/types/services/task/index.d.ts +0 -650
  311. package/src/services/task/index.ts +0 -1801
  312. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -3,19 +3,121 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.shouldAutoAnswerTask = exports.isWebRTCCall = exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.isDigitalOutbound = exports.isCampaignPreviewReservation = exports.isAutoAnswerEnabled = exports.hasAgentInitiatedOutdial = exports.getIsConferenceInProgress = exports.checkParticipantNotInInteraction = void 0;
6
+ exports.shouldAutoAnswerTask = exports.isWebRTCCall = exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.isEpDnConsultPendingConferenceMerge = exports.isDigitalOutbound = exports.isCampaignPreviewTask = exports.isCampaignPreviewReservation = exports.isAutoAnswerEnabled = exports.hasAgentInitiatedOutdial = exports.getServerHoldStateForControls = exports.getIsCustomerInCall = exports.getIsConsultedAgentForControls = exports.getIsConsultInProgressForConferenceControls = exports.getIsConferenceInProgress = exports.getConsultMediaResourceId = exports.getConferenceParticipantsCount = exports.checkParticipantNotInInteraction = void 0;
7
7
  var _types = require("./types");
8
- var _types2 = require("../config/types");
9
- var _constants = require("../../constants");
10
- var _types3 = require("../../types");
8
+ var _types2 = require("../../types");
9
+ var _constants = require("./state-machine/constants");
10
+ var _types3 = require("../config/types");
11
+ var _constants2 = require("../../constants");
11
12
  /* eslint-disable import/prefer-default-export */
12
13
 
14
+ const CAMPAIGN_PREVIEW_OUTBOUND_TYPES = ['STANDARD_PREVIEW_CAMPAIGN', 'DIRECT_PREVIEW_CAMPAIGN'];
15
+ const CAMPAIGN_PREVIEW_CAMPAIGN_TYPES = ['preview_standard', 'preview_direct'];
16
+
17
+ /**
18
+ * Checks if the customer is still in the call (not left)
19
+ *
20
+ * @param interaction - The interaction object
21
+ * @param interactionId - The main interaction ID
22
+ * @returns true if customer is in the call
23
+ */
24
+ const getIsCustomerInCall = (interaction, interactionId) => {
25
+ const mainCallMedia = interaction.media?.[interactionId];
26
+ const participants = interaction.participants;
27
+ if (!mainCallMedia?.participants || !participants) {
28
+ return false;
29
+ }
30
+ return mainCallMedia.participants.some(participantId => {
31
+ const participant = participants[participantId];
32
+ return participant?.pType === _constants.PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;
33
+ });
34
+ };
35
+
36
+ /**
37
+ * Gets the count of active agent participants in the conference
38
+ * Excludes Customer, Supervisor, and VVA participant types
39
+ *
40
+ * @param interaction - The interaction object
41
+ * @param interactionId - The main interaction ID
42
+ * @returns Number of active agent participants
43
+ */
44
+ exports.getIsCustomerInCall = getIsCustomerInCall;
45
+ const getConferenceParticipantsCount = (interaction, interactionId) => {
46
+ const mainCallMedia = interaction.media?.[interactionId];
47
+ const participants = interaction.participants;
48
+ if (!mainCallMedia?.participants || !participants) {
49
+ return 0;
50
+ }
51
+ let count = 0;
52
+ for (const participantId of mainCallMedia.participants) {
53
+ const participant = participants[participantId];
54
+ if (participant && participant.pType !== _constants.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
55
+ count += 1;
56
+ }
57
+ }
58
+ return count;
59
+ };
60
+
61
+ /**
62
+ * Determines if a consult is actively in-progress for conference control gating.
63
+ * This is used to disable conference controls (End/Consult) only when a consult leg
64
+ * still exists outside the main call participants.
65
+ */
66
+ exports.getConferenceParticipantsCount = getConferenceParticipantsCount;
67
+ const getIsConsultInProgressForConferenceControls = (interaction, mainCallId, selfAgentId) => {
68
+ if (!interaction || !mainCallId) return false;
69
+ const mainParticipants = interaction.media?.[mainCallId]?.participants;
70
+ if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;
71
+ const mainSet = new Set(mainParticipants);
72
+ const media = interaction.media;
73
+ if (!media) return false;
74
+ return Object.values(media).some(m => {
75
+ if (!m || m.mType !== 'consult') return false;
76
+ if (!Array.isArray(m.participants) || m.participants.length === 0) return false;
77
+ return m.participants.some(participantId => {
78
+ const p = interaction.participants?.[participantId];
79
+ if (!p || p.hasLeft) return false;
80
+ if (selfAgentId && participantId === selfAgentId) return false;
81
+ if (mainSet.has(participantId)) return false;
82
+ const participantType = String(p.pType ?? '').toUpperCase();
83
+ const isEpDnParticipant = participantType === 'EP-DN' || participantType === 'EP_DN' || participantType === 'DN';
84
+ if (isEpDnParticipant) {
85
+ if (!selfAgentId) {
86
+ return true;
87
+ }
88
+ const selfConsultState = interaction.participants?.[selfAgentId]?.consultState;
89
+ return selfConsultState === 'consulting' || selfConsultState === 'conferencing' || selfConsultState === 'consultInitiated';
90
+ }
91
+ const consultState = p.consultState;
92
+ const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;
93
+ const consultLegActive = consultState === 'consulting' || p.currentState === 'consulting' || p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee;
94
+ return consultLegActive;
95
+ });
96
+ });
97
+ };
98
+ exports.getIsConsultInProgressForConferenceControls = getIsConsultInProgressForConferenceControls;
99
+ const getIsConsultedAgentForControls = (taskData, context, isConsultingState) => {
100
+ return Boolean(taskData?.isConsulted) || isConsultingState && !context.consultInitiator;
101
+ };
102
+ exports.getIsConsultedAgentForControls = getIsConsultedAgentForControls;
103
+ const getServerHoldStateForControls = (context, mainCallId, fallbackTaskData) => {
104
+ const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;
105
+ if (!media) return undefined;
106
+ if (mainCallId && media[mainCallId]) {
107
+ return media[mainCallId].isHold ?? false;
108
+ }
109
+ const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;
110
+ if (!mediaId) return undefined;
111
+ return media[mediaId]?.isHold;
112
+ };
113
+
13
114
  /**
14
115
  * Determines if the given agent is the primary agent (owner) of the task
15
116
  * @param task - The task to check
16
117
  * @param agentId - The agent ID to check for primary status
17
118
  * @returns true if the agent is the primary agent, false otherwise
18
119
  */
120
+ exports.getServerHoldStateForControls = getServerHoldStateForControls;
19
121
  const isPrimary = (task, agentId) => {
20
122
  if (!task.data?.interaction?.owner) {
21
123
  // Fall back to checking data.agentId when owner is not set
@@ -35,7 +137,7 @@ const isParticipantInMainInteraction = (task, agentId) => {
35
137
  if (!task?.data?.interaction?.media) {
36
138
  return false;
37
139
  }
38
- return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId));
140
+ return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType === _constants.MEDIA_TYPE_MAIN_CALL && mediaObj.participants?.includes(agentId));
39
141
  };
40
142
 
41
143
  /**
@@ -57,25 +159,68 @@ const checkParticipantNotInInteraction = (task, agentId) => {
57
159
 
58
160
  /**
59
161
  * Determines if a conference is currently in progress based on the number of active agent participants
60
- * @param TaskData - The payLoad data to check for conference status
162
+ * @param data - The task data to check for conference status
61
163
  * @returns true if there are 2 or more active agent participants in the main call, false otherwise
164
+ *
165
+ * For Agent B (consulted agent), their task's interactionId may be different from the main call.
166
+ * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.
62
167
  */
63
168
  exports.checkParticipantNotInInteraction = checkParticipantNotInInteraction;
64
169
  const getIsConferenceInProgress = data => {
65
- const mediaMainCall = data.interaction.media?.[data?.interactionId];
170
+ if (!data.interaction) return false;
171
+ const mainCallId = data.interaction.mainInteractionId || data.interactionId;
172
+ const mediaMainCall = data.interaction.media?.[mainCallId];
66
173
  const participantsInMainCall = new Set(mediaMainCall?.participants);
67
- const participants = data.interaction.participants;
174
+ const {
175
+ participants
176
+ } = data.interaction;
68
177
  const agentParticipants = new Set();
69
- if (participantsInMainCall.size > 0) {
70
- participantsInMainCall.forEach(participantId => {
71
- const participant = participants?.[participantId];
72
- if (participant && participant.pType !== 'Customer' && participant.pType !== 'Supervisor' && !participant.hasLeft && participant.pType !== 'VVA') {
73
- agentParticipants.add(participantId);
74
- }
75
- });
76
- }
178
+ participantsInMainCall.forEach(participantId => {
179
+ const participant = participants[participantId];
180
+ if (participant && participant.pType !== _constants.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
181
+ agentParticipants.add(participantId);
182
+ }
183
+ });
77
184
  return agentParticipants.size >= 2;
78
185
  };
186
+ exports.getIsConferenceInProgress = getIsConferenceInProgress;
187
+ const EP_DN_MERGE_TERMINAL_CONSULT_EVENTS = new Set([_types3.CC_EVENTS.AGENT_CONSULT_ENDED, _types3.CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED]);
188
+ const isEpDnParticipantType = pType => {
189
+ const normalized = String(pType ?? '').toUpperCase();
190
+ return normalized === 'EP-DN' || normalized === 'EP_DN' || normalized === 'DN';
191
+ };
192
+
193
+ /** EP-DN consult merged to conference before a second agent joins the main leg (CAI-8329). */
194
+ const isEpDnConsultPendingConferenceMerge = (taskData, selfAgentId) => {
195
+ if (!taskData?.interaction || !selfAgentId) return false;
196
+ if (taskData.type && EP_DN_MERGE_TERMINAL_CONSULT_EVENTS.has(taskData.type)) {
197
+ return false;
198
+ }
199
+ const interaction = taskData.interaction;
200
+ const mainCallId = interaction.mainInteractionId || taskData.interactionId;
201
+ if (!mainCallId) return false;
202
+ if (getConferenceParticipantsCount(interaction, mainCallId) > 1) return false;
203
+ const selfParticipant = interaction.participants?.[selfAgentId];
204
+ if (taskData.isConsulted === true || selfParticipant?.consultState === 'consultCompleted') {
205
+ return false;
206
+ }
207
+ const mainParticipantIds = new Set(interaction.media?.[mainCallId]?.participants ?? []);
208
+ const hasEpDnOnConsultLegNotMain = Object.values(interaction.media ?? {}).some(media => {
209
+ if (media?.mType !== _constants.MEDIA_TYPE_CONSULT) return false;
210
+ return (media.participants ?? []).some(participantId => {
211
+ if (participantId === selfAgentId || mainParticipantIds.has(participantId)) return false;
212
+ const participant = interaction.participants?.[participantId];
213
+ if (!participant || participant.hasLeft) return false;
214
+ return isEpDnParticipantType(participant.pType);
215
+ });
216
+ });
217
+ if (!hasEpDnOnConsultLegNotMain) return false;
218
+ const callProcessingDetails = interaction.callProcessingDetails;
219
+ const customerLeft = callProcessingDetails?.hasCustomerLeft === 'true' || !getIsCustomerInCall(interaction, mainCallId);
220
+ const conferenceFromPayload = interaction.state === _constants.INTERACTION_STATE.CONFERENCE || getIsConferenceInProgress(taskData) || interaction.state === _constants.INTERACTION_STATE.POST_CALL && customerLeft;
221
+ if (!conferenceFromPayload) return false;
222
+ return taskData.consultingAgentId === selfAgentId || interaction.owner === selfAgentId || selfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING || selfParticipant?.consultState === _constants.CONSULT_STATE.CONFERENCING || selfParticipant?.consultState === 'consultInitiated';
223
+ };
79
224
 
80
225
  /**
81
226
  * Checks if the current agent is a secondary agent in a consultation scenario.
@@ -83,7 +228,7 @@ const getIsConferenceInProgress = data => {
83
228
  * @param task - The task object containing interaction details
84
229
  * @returns true if this is a secondary agent (consulted party), false otherwise
85
230
  */
86
- exports.getIsConferenceInProgress = getIsConferenceInProgress;
231
+ exports.isEpDnConsultPendingConferenceMerge = isEpDnConsultPendingConferenceMerge;
87
232
  const isSecondaryAgent = interaction => {
88
233
  if (!interaction.callProcessingDetails) {
89
234
  return false;
@@ -94,24 +239,33 @@ const isSecondaryAgent = interaction => {
94
239
  /**
95
240
  * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.
96
241
  * This is specifically for telephony consultations to external numbers/entry points.
97
- * @param task - The task object containing interaction details
242
+ * @param interaction - The interaction object
98
243
  * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise
99
244
  */
100
245
  exports.isSecondaryAgent = isSecondaryAgent;
101
246
  const isSecondaryEpDnAgent = interaction => {
102
- if (!interaction) {
103
- return false;
104
- }
105
247
  return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);
106
248
  };
107
249
 
250
+ /**
251
+ * Checks if the task belongs to a campaign preview interaction.
252
+ * Campaign preview ContactEnded events are terminal cleanup events and should not trigger wrapup.
253
+ */
254
+ exports.isSecondaryEpDnAgent = isSecondaryEpDnAgent;
255
+ const isCampaignPreviewTask = taskData => {
256
+ const outboundType = taskData?.interaction?.outboundType ?? '';
257
+ const cpd = taskData?.interaction?.callProcessingDetails;
258
+ const campaignType = cpd?.campaignType ?? '';
259
+ return CAMPAIGN_PREVIEW_OUTBOUND_TYPES.includes(outboundType) || CAMPAIGN_PREVIEW_CAMPAIGN_TYPES.includes(campaignType);
260
+ };
261
+
108
262
  /**
109
263
  * Checks if auto-answer is enabled for the agent participant
110
264
  * @param interaction - The interaction object
111
265
  * @param agentId - Current agent ID
112
266
  * @returns true if auto-answer is enabled, false otherwise
113
267
  */
114
- exports.isSecondaryEpDnAgent = isSecondaryEpDnAgent;
268
+ exports.isCampaignPreviewTask = isCampaignPreviewTask;
115
269
  const isAutoAnswerEnabled = (interaction, agentId) => {
116
270
  return interaction.participants?.[agentId]?.autoAnswerEnabled === true;
117
271
  };
@@ -125,7 +279,7 @@ const isAutoAnswerEnabled = (interaction, agentId) => {
125
279
  */
126
280
  exports.isAutoAnswerEnabled = isAutoAnswerEnabled;
127
281
  const isWebRTCCall = (interaction, loginOption, webRtcEnabled) => {
128
- return webRtcEnabled && loginOption === _types3.LoginOption.BROWSER && interaction.mediaType === _constants.OUTDIAL_MEDIA_TYPE;
282
+ return webRtcEnabled && loginOption === _types2.LoginOption.BROWSER && interaction.mediaType === _constants2.OUTDIAL_MEDIA_TYPE;
129
283
  };
130
284
 
131
285
  /**
@@ -135,7 +289,7 @@ const isWebRTCCall = (interaction, loginOption, webRtcEnabled) => {
135
289
  */
136
290
  exports.isWebRTCCall = isWebRTCCall;
137
291
  const isDigitalOutbound = interaction => {
138
- return interaction.contactDirection?.type === _constants.OUTDIAL_DIRECTION && interaction.outboundType === _constants.OUTBOUND_TYPE && (interaction.mediaChannel === _types.MEDIA_CHANNEL.EMAIL || interaction.mediaChannel === _types.MEDIA_CHANNEL.SMS);
292
+ return interaction.contactDirection?.type === _constants2.OUTDIAL_DIRECTION && interaction.outboundType === _constants2.OUTBOUND_TYPE && (interaction.mediaChannel === _types.MEDIA_CHANNEL.EMAIL || interaction.mediaChannel === _types.MEDIA_CHANNEL.SMS);
139
293
  };
140
294
 
141
295
  /**
@@ -146,7 +300,7 @@ const isDigitalOutbound = interaction => {
146
300
  */
147
301
  exports.isDigitalOutbound = isDigitalOutbound;
148
302
  const hasAgentInitiatedOutdial = (interaction, agentId) => {
149
- return interaction.contactDirection?.type === _constants.OUTDIAL_DIRECTION && interaction.outboundType === _constants.OUTBOUND_TYPE && interaction.callProcessingDetails?.outdialAgentId === agentId && interaction.owner === agentId && !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS;
303
+ return interaction.contactDirection?.type === _constants2.OUTDIAL_DIRECTION && interaction.outboundType === _constants2.OUTBOUND_TYPE && interaction.callProcessingDetails?.outdialAgentId === agentId && interaction.owner === agentId && !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS;
150
304
  };
151
305
 
152
306
  /**
@@ -191,6 +345,36 @@ const shouldAutoAnswerTask = (taskData, agentId, loginOption, webRtcEnabled) =>
191
345
  return false;
192
346
  };
193
347
 
348
+ /**
349
+ * Gets the consult media resource ID for switch-call operations.
350
+ * Searches for the consult media leg in the interaction.
351
+ *
352
+ * @param interaction - The interaction object
353
+ * @param consultMediaResourceId - The consult media resource ID from task data
354
+ * @param agentId - Current agent ID
355
+ * @returns The consult media resource ID or undefined
356
+ */
357
+ exports.shouldAutoAnswerTask = shouldAutoAnswerTask;
358
+ const getConsultMediaResourceId = (interaction, consultMediaResourceId, agentId) => {
359
+ // First priority: use consultMediaResourceId from task data if available
360
+ if (consultMediaResourceId) {
361
+ return consultMediaResourceId;
362
+ }
363
+
364
+ // Second priority: search for consult media leg in interaction.media
365
+ if (!interaction?.media || !agentId) {
366
+ return undefined;
367
+ }
368
+
369
+ // Find the consult media leg where this agent is a participant
370
+ for (const [mediaId, media] of Object.entries(interaction.media)) {
371
+ if (media.mType === 'consult' && media.participants?.includes(agentId)) {
372
+ return mediaId;
373
+ }
374
+ }
375
+ return undefined;
376
+ };
377
+
194
378
  /**
195
379
  * Checks if a task is a campaign preview reservation that has not yet been accepted.
196
380
  * Campaign preview tasks should not trigger incoming call handling until the agent
@@ -198,9 +382,9 @@ const shouldAutoAnswerTask = (taskData, agentId, loginOption, webRtcEnabled) =>
198
382
  * @param task - The task to check
199
383
  * @returns true if the task is a pending campaign preview reservation, false otherwise
200
384
  */
201
- exports.shouldAutoAnswerTask = shouldAutoAnswerTask;
385
+ exports.getConsultMediaResourceId = getConsultMediaResourceId;
202
386
  const isCampaignPreviewReservation = task => {
203
- return task?.data?.type === _types2.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;
387
+ return task?.data?.type === _types3.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;
204
388
  };
205
389
  exports.isCampaignPreviewReservation = isCampaignPreviewReservation;
206
390
  //# sourceMappingURL=TaskUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_types2","_constants","_types3","isPrimary","task","agentId","data","interaction","owner","exports","isParticipantInMainInteraction","media","Object","values","some","mediaObj","mType","participants","includes","checkParticipantNotInInteraction","hasLeft","getIsConferenceInProgress","mediaMainCall","interactionId","participantsInMainCall","Set","agentParticipants","size","forEach","participantId","participant","pType","add","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","type","OUTDIAL_DIRECTION","outboundType","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","taskData","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","length","isCampaignPreviewReservation","CC_EVENTS","AGENT_OFFER_CAMPAIGN_RESERVATION"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {CC_EVENTS} from '../config/types';\nimport {OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE, OUTBOUND_TYPE} from '../../constants';\nimport {LoginOption} from '../../types';\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param TaskData - The payLoad data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n const mediaMainCall = data.interaction.media?.[data?.interactionId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const participants = data.interaction.participants;\n\n const agentParticipants = new Set();\n if (participantsInMainCall.size > 0) {\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants?.[participantId];\n if (\n participant &&\n participant.pType !== 'Customer' &&\n participant.pType !== 'Supervisor' &&\n !participant.hasLeft &&\n participant.pType !== 'VVA'\n ) {\n agentParticipants.add(participantId);\n }\n });\n }\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n if (!interaction) {\n return false;\n }\n\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Checks if a task is a campaign preview reservation that has not yet been accepted.\n * Campaign preview tasks should not trigger incoming call handling until the agent\n * explicitly accepts the preview contact.\n * @param task - The task to check\n * @returns true if the task is a pending campaign preview reservation, false otherwise\n */\nexport const isCampaignPreviewReservation = (task: ITask): boolean => {\n return task?.data?.type === CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;\n};\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAJA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMI,SAAS,GAAGA,CAACC,IAAW,EAAEC,OAAe,KAAc;EAClE,IAAI,CAACD,IAAI,CAACE,IAAI,EAAEC,WAAW,EAAEC,KAAK,EAAE;IAClC;IACA,OAAOJ,IAAI,CAACE,IAAI,CAACD,OAAO,KAAKA,OAAO;EACtC;EAEA,OAAOD,IAAI,CAACE,IAAI,CAACC,WAAW,CAACC,KAAK,KAAKH,OAAO;AAChD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAI,OAAA,CAAAN,SAAA,GAAAA,SAAA;AAMO,MAAMO,8BAA8B,GAAGA,CAACN,IAAW,EAAEC,OAAe,KAAc;EACvF,IAAI,CAACD,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEI,KAAK,EAAE;IACnC,OAAO,KAAK;EACd;EAEA,OAAOC,MAAM,CAACC,MAAM,CAACT,IAAI,CAACE,IAAI,CAACC,WAAW,CAACI,KAAK,CAAC,CAACG,IAAI,CACnDC,QAAQ,IACPA,QAAQ,IAAIA,QAAQ,CAACC,KAAK,KAAK,UAAU,IAAID,QAAQ,CAACE,YAAY,EAAEC,QAAQ,CAACb,OAAO,CACxF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAI,OAAA,CAAAC,8BAAA,GAAAA,8BAAA;AAMO,MAAMS,gCAAgC,GAAGA,CAACf,IAAW,EAAEC,OAAe,KAAc;EACzF,IAAI,CAACD,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEU,YAAY,EAAE;IAC1C,OAAO,IAAI;EACb;EACA,MAAM;IAACX;EAAI,CAAC,GAAGF,IAAI;EAEnB,OACE,EAAEC,OAAO,IAAIC,IAAI,CAACC,WAAW,CAACU,YAAY,CAAC,IAC1CZ,OAAO,IAAIC,IAAI,CAACC,WAAW,CAACU,YAAY,IAAIX,IAAI,CAACC,WAAW,CAACU,YAAY,CAACZ,OAAO,CAAC,CAACe,OAAQ;AAEhG,CAAC;;AAED;AACA;AACA;AACA;AACA;AAJAX,OAAA,CAAAU,gCAAA,GAAAA,gCAAA;AAKO,MAAME,yBAAyB,GAAIf,IAAc,IAAc;EACpE,MAAMgB,aAAa,GAAGhB,IAAI,CAACC,WAAW,CAACI,KAAK,GAAGL,IAAI,EAAEiB,aAAa,CAAC;EACnE,MAAMC,sBAAsB,GAAG,IAAIC,GAAG,CAACH,aAAa,EAAEL,YAAY,CAAC;EACnE,MAAMA,YAAY,GAAGX,IAAI,CAACC,WAAW,CAACU,YAAY;EAElD,MAAMS,iBAAiB,GAAG,IAAID,GAAG,CAAC,CAAC;EACnC,IAAID,sBAAsB,CAACG,IAAI,GAAG,CAAC,EAAE;IACnCH,sBAAsB,CAACI,OAAO,CAAEC,aAAqB,IAAK;MACxD,MAAMC,WAAW,GAAGb,YAAY,GAAGY,aAAa,CAAC;MACjD,IACEC,WAAW,IACXA,WAAW,CAACC,KAAK,KAAK,UAAU,IAChCD,WAAW,CAACC,KAAK,KAAK,YAAY,IAClC,CAACD,WAAW,CAACV,OAAO,IACpBU,WAAW,CAACC,KAAK,KAAK,KAAK,EAC3B;QACAL,iBAAiB,CAACM,GAAG,CAACH,aAAa,CAAC;MACtC;IACF,CAAC,CAAC;EACJ;EAEA,OAAOH,iBAAiB,CAACC,IAAI,IAAI,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAlB,OAAA,CAAAY,yBAAA,GAAAA,yBAAA;AAMO,MAAMY,gBAAgB,GAAI1B,WAAwB,IAAc;EACrE,IAAI,CAACA,WAAW,CAAC2B,qBAAqB,EAAE;IACtC,OAAO,KAAK;EACd;EAEA,OACE3B,WAAW,CAAC2B,qBAAqB,CAACC,gBAAgB,KAAK,SAAS,IAChE,CAAC,CAAC5B,WAAW,CAAC2B,qBAAqB,CAACE,mBAAmB,IACvD7B,WAAW,CAAC2B,qBAAqB,CAACE,mBAAmB,KAAK7B,WAAW,CAACgB,aAAa;AAEvF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAd,OAAA,CAAAwB,gBAAA,GAAAA,gBAAA;AAMO,MAAMI,oBAAoB,GAAI9B,WAAwB,IAAc;EACzE,IAAI,CAACA,WAAW,EAAE;IAChB,OAAO,KAAK;EACd;EAEA,OAAOA,WAAW,CAAC+B,SAAS,KAAK,WAAW,IAAIL,gBAAgB,CAAC1B,WAAW,CAAC;AAC/E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAE,OAAA,CAAA4B,oBAAA,GAAAA,oBAAA;AAMO,MAAME,mBAAmB,GAAGA,CAAChC,WAAwB,EAAEF,OAAe,KAAc;EACzF,OAAOE,WAAW,CAACU,YAAY,GAAGZ,OAAO,CAAC,EAAEmC,iBAAiB,KAAK,IAAI;AACxE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AANA/B,OAAA,CAAA8B,mBAAA,GAAAA,mBAAA;AAOO,MAAME,YAAY,GAAGA,CAC1BlC,WAAwB,EACxBmC,WAAmB,EACnBC,aAAsB,KACV;EACZ,OACEA,aAAa,IACbD,WAAW,KAAKE,mBAAW,CAACC,OAAO,IACnCtC,WAAW,CAAC+B,SAAS,KAAKQ,6BAAkB;AAEhD,CAAC;;AAED;AACA;AACA;AACA;AACA;AAJArC,OAAA,CAAAgC,YAAA,GAAAA,YAAA;AAKO,MAAMM,iBAAiB,GAAIxC,WAAwB,IAAc;EACtE,OACEA,WAAW,CAACyC,gBAAgB,EAAEC,IAAI,KAAKC,4BAAiB,IACxD3C,WAAW,CAAC4C,YAAY,KAAKC,wBAAa,KACzC7C,WAAW,CAAC8C,YAAY,KAAKC,oBAAa,CAACC,KAAK,IAC/ChD,WAAW,CAAC8C,YAAY,KAAKC,oBAAa,CAACE,GAAG,CAAC;AAErD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALA/C,OAAA,CAAAsC,iBAAA,GAAAA,iBAAA;AAMO,MAAMU,wBAAwB,GAAGA,CAAClD,WAAwB,EAAEF,OAAe,KAAc;EAC9F,OACEE,WAAW,CAACyC,gBAAgB,EAAEC,IAAI,KAAKC,4BAAiB,IACxD3C,WAAW,CAAC4C,YAAY,KAAKC,wBAAa,IAC1C7C,WAAW,CAAC2B,qBAAqB,EAAEwB,cAAc,KAAKrD,OAAO,IAC7DE,WAAW,CAACC,KAAK,KAAKH,OAAO,IAC7B,CAACE,WAAW,CAAC2B,qBAAqB,EAAEyB,0BAA0B;AAElE,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZAlD,OAAA,CAAAgD,wBAAA,GAAAA,wBAAA;AAaO,MAAMG,oBAAoB,GAAGA,CAClCC,QAAkB,EAClBxD,OAAe,EACfqC,WAAmB,EACnBC,aAAsB,KACV;EACZ,MAAM;IAACpC;EAAW,CAAC,GAAGsD,QAAQ;EAE9B,IAAI,CAACtD,WAAW,IAAI,CAACF,OAAO,EAAE;IAC5B,OAAO,KAAK;EACd;;EAEA;EACA,MAAMmC,iBAAiB,GAAGD,mBAAmB,CAAChC,WAAW,EAAEF,OAAO,CAAC;;EAEnE;EACA,MAAMyD,qBAAqB,GAAGL,wBAAwB,CAAClD,WAAW,EAAEF,OAAO,CAAC;;EAE5E;EACA,IAAIoC,YAAY,CAAClC,WAAW,EAAEmC,WAAW,EAAEC,aAAa,CAAC,EAAE;IACzD,OAAOH,iBAAiB,IAAIsB,qBAAqB;EACnD;;EAEA;EACA,IAAIf,iBAAiB,CAACxC,WAAW,CAAC,IAAIuD,qBAAqB,EAAE;IAC3D;IACA,MAAMC,iBAAiB,GAAGxD,WAAW,CAACyD,cAAc,IAAIzD,WAAW,CAACyD,cAAc,CAACC,MAAM,GAAG,CAAC;IAE7F,OAAO,CAACF,iBAAiB;EAC3B;EAEA,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AANAtD,OAAA,CAAAmD,oBAAA,GAAAA,oBAAA;AAOO,MAAMM,4BAA4B,GAAI9D,IAAW,IAAc;EACpE,OAAOA,IAAI,EAAEE,IAAI,EAAE2C,IAAI,KAAKkB,iBAAS,CAACC,gCAAgC;AACxE,CAAC;AAAC3D,OAAA,CAAAyD,4BAAA,GAAAA,4BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_types2","_constants","_types3","_constants2","CAMPAIGN_PREVIEW_OUTBOUND_TYPES","CAMPAIGN_PREVIEW_CAMPAIGN_TYPES","getIsCustomerInCall","interaction","interactionId","mainCallMedia","media","participants","some","participantId","participant","pType","PARTICIPANT_TYPE","CUSTOMER","hasLeft","exports","getConferenceParticipantsCount","count","SUPERVISOR","VVA","getIsConsultInProgressForConferenceControls","mainCallId","selfAgentId","mainParticipants","Array","isArray","length","mainSet","Set","Object","values","m","mType","p","has","participantType","String","toUpperCase","isEpDnParticipant","selfConsultState","consultState","isRonaPendingConsultee","hasJoined","consultLegActive","currentState","isConsulted","getIsConsultedAgentForControls","taskData","context","isConsultingState","Boolean","consultInitiator","getServerHoldStateForControls","fallbackTaskData","undefined","isHold","mediaId","mediaResourceId","isPrimary","task","agentId","data","owner","isParticipantInMainInteraction","mediaObj","MEDIA_TYPE_MAIN_CALL","includes","checkParticipantNotInInteraction","getIsConferenceInProgress","mainInteractionId","mediaMainCall","participantsInMainCall","agentParticipants","forEach","add","size","EP_DN_MERGE_TERMINAL_CONSULT_EVENTS","CC_EVENTS","AGENT_CONSULT_ENDED","AGENT_CONSULT_CONFERENCE_ENDED","isEpDnParticipantType","normalized","isEpDnConsultPendingConferenceMerge","type","selfParticipant","mainParticipantIds","hasEpDnOnConsultLegNotMain","MEDIA_TYPE_CONSULT","callProcessingDetails","customerLeft","hasCustomerLeft","conferenceFromPayload","state","INTERACTION_STATE","CONFERENCE","POST_CALL","consultingAgentId","CONSULT_STATE","CONSULTING","CONFERENCING","isSecondaryAgent","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType","isCampaignPreviewTask","outboundType","cpd","campaignType","isAutoAnswerEnabled","autoAnswerEnabled","isWebRTCCall","loginOption","webRtcEnabled","LoginOption","BROWSER","OUTDIAL_MEDIA_TYPE","isDigitalOutbound","contactDirection","OUTDIAL_DIRECTION","OUTBOUND_TYPE","mediaChannel","MEDIA_CHANNEL","EMAIL","SMS","hasAgentInitiatedOutdial","outdialAgentId","BLIND_TRANSFER_IN_PROGRESS","shouldAutoAnswerTask","agentInitiatedOutdial","hasPreviousVteams","previousVTeams","getConsultMediaResourceId","consultMediaResourceId","entries","isCampaignPreviewReservation","AGENT_OFFER_CAMPAIGN_RESERVATION"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData, MEDIA_CHANNEL} from './types';\nimport {LoginOption} from '../../types';\nimport {\n PARTICIPANT_TYPE,\n MEDIA_TYPE_MAIN_CALL,\n CONSULT_STATE,\n INTERACTION_STATE,\n MEDIA_TYPE_CONSULT,\n} from './state-machine/constants';\nimport {TaskContext} from './state-machine/types';\nimport {CC_EVENTS} from '../config/types';\nimport {OUTBOUND_TYPE, OUTDIAL_DIRECTION, OUTDIAL_MEDIA_TYPE} from '../../constants';\n\nconst CAMPAIGN_PREVIEW_OUTBOUND_TYPES = ['STANDARD_PREVIEW_CAMPAIGN', 'DIRECT_PREVIEW_CAMPAIGN'];\nconst CAMPAIGN_PREVIEW_CAMPAIGN_TYPES = ['preview_standard', 'preview_direct'];\n\n/**\n * Checks if the customer is still in the call (not left)\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns true if customer is in the call\n */\nexport const getIsCustomerInCall = (interaction: Interaction, interactionId: string): boolean => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return false;\n }\n\n return mainCallMedia.participants.some((participantId: string) => {\n const participant = participants[participantId];\n\n return participant?.pType === PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;\n });\n};\n\n/**\n * Gets the count of active agent participants in the conference\n * Excludes Customer, Supervisor, and VVA participant types\n *\n * @param interaction - The interaction object\n * @param interactionId - The main interaction ID\n * @returns Number of active agent participants\n */\nexport const getConferenceParticipantsCount = (\n interaction: Interaction,\n interactionId: string\n): number => {\n const mainCallMedia = interaction.media?.[interactionId];\n const participants = interaction.participants;\n if (!mainCallMedia?.participants || !participants) {\n return 0;\n }\n\n let count = 0;\n for (const participantId of mainCallMedia.participants) {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n count += 1;\n }\n }\n\n return count;\n};\n\n/**\n * Determines if a consult is actively in-progress for conference control gating.\n * This is used to disable conference controls (End/Consult) only when a consult leg\n * still exists outside the main call participants.\n */\nexport const getIsConsultInProgressForConferenceControls = (\n interaction: Interaction | undefined,\n mainCallId: string | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!interaction || !mainCallId) return false;\n\n const mainParticipants = interaction.media?.[mainCallId]?.participants;\n if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;\n\n const mainSet = new Set(mainParticipants);\n const media = interaction.media;\n if (!media) return false;\n\n return Object.values(media).some((m: any) => {\n if (!m || m.mType !== 'consult') return false;\n if (!Array.isArray(m.participants) || m.participants.length === 0) return false;\n\n return m.participants.some((participantId: string) => {\n const p: any = interaction.participants?.[participantId];\n if (!p || p.hasLeft) return false;\n if (selfAgentId && participantId === selfAgentId) return false;\n if (mainSet.has(participantId)) return false;\n\n const participantType = String(p.pType ?? '').toUpperCase();\n const isEpDnParticipant =\n participantType === 'EP-DN' || participantType === 'EP_DN' || participantType === 'DN';\n if (isEpDnParticipant) {\n if (!selfAgentId) {\n return true;\n }\n const selfConsultState = interaction.participants?.[selfAgentId]?.consultState as\n | string\n | undefined;\n\n return (\n selfConsultState === 'consulting' ||\n selfConsultState === 'conferencing' ||\n selfConsultState === 'consultInitiated'\n );\n }\n\n const consultState = p.consultState as string | undefined;\n const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;\n const consultLegActive =\n consultState === 'consulting' ||\n p.currentState === 'consulting' ||\n (p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee);\n\n return consultLegActive;\n });\n });\n};\n\nexport const getIsConsultedAgentForControls = (\n taskData: TaskData | null,\n context: TaskContext,\n isConsultingState: boolean\n): boolean => {\n return Boolean(taskData?.isConsulted) || (isConsultingState && !context.consultInitiator);\n};\n\nexport const getServerHoldStateForControls = (\n context: TaskContext,\n mainCallId?: string,\n fallbackTaskData?: TaskData | null\n): boolean | undefined => {\n const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;\n if (!media) return undefined;\n\n if (mainCallId && media[mainCallId]) {\n return media[mainCallId].isHold ?? false;\n }\n\n const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;\n if (!mediaId) return undefined;\n\n return media[mediaId]?.isHold;\n};\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj &&\n mediaObj.mType === MEDIA_TYPE_MAIN_CALL &&\n mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param data - The task data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n *\n * For Agent B (consulted agent), their task's interactionId may be different from the main call.\n * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n if (!data.interaction) return false;\n\n const mainCallId = data.interaction.mainInteractionId || data.interactionId;\n const mediaMainCall = data.interaction.media?.[mainCallId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const {participants} = data.interaction;\n\n const agentParticipants = new Set();\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants[participantId];\n if (\n participant &&\n participant.pType !== PARTICIPANT_TYPE.CUSTOMER &&\n participant.pType !== PARTICIPANT_TYPE.SUPERVISOR &&\n participant.pType !== PARTICIPANT_TYPE.VVA &&\n !participant.hasLeft\n ) {\n agentParticipants.add(participantId);\n }\n });\n\n return agentParticipants.size >= 2;\n};\n\nconst EP_DN_MERGE_TERMINAL_CONSULT_EVENTS = new Set<string>([\n CC_EVENTS.AGENT_CONSULT_ENDED,\n CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED,\n]);\n\nconst isEpDnParticipantType = (pType: string | undefined): boolean => {\n const normalized = String(pType ?? '').toUpperCase();\n\n return normalized === 'EP-DN' || normalized === 'EP_DN' || normalized === 'DN';\n};\n\n/** EP-DN consult merged to conference before a second agent joins the main leg (CAI-8329). */\nexport const isEpDnConsultPendingConferenceMerge = (\n taskData: TaskData | undefined,\n selfAgentId: string | undefined\n): boolean => {\n if (!taskData?.interaction || !selfAgentId) return false;\n\n if (taskData.type && EP_DN_MERGE_TERMINAL_CONSULT_EVENTS.has(taskData.type)) {\n return false;\n }\n\n const interaction = taskData.interaction;\n const mainCallId = interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n if (getConferenceParticipantsCount(interaction, mainCallId) > 1) return false;\n\n const selfParticipant = interaction.participants?.[selfAgentId] as\n | {consultState?: string}\n | undefined;\n if (taskData.isConsulted === true || selfParticipant?.consultState === 'consultCompleted') {\n return false;\n }\n\n const mainParticipantIds = new Set(interaction.media?.[mainCallId]?.participants ?? []);\n const hasEpDnOnConsultLegNotMain = Object.values(interaction.media ?? {}).some((media: any) => {\n if (media?.mType !== MEDIA_TYPE_CONSULT) return false;\n\n return (media.participants ?? []).some((participantId: string) => {\n if (participantId === selfAgentId || mainParticipantIds.has(participantId)) return false;\n const participant = interaction.participants?.[participantId] as\n | {hasLeft?: boolean; pType?: string}\n | undefined;\n if (!participant || participant.hasLeft) return false;\n\n return isEpDnParticipantType(participant.pType);\n });\n });\n if (!hasEpDnOnConsultLegNotMain) return false;\n\n const callProcessingDetails = interaction.callProcessingDetails as\n | {hasCustomerLeft?: string}\n | undefined;\n const customerLeft =\n callProcessingDetails?.hasCustomerLeft === 'true' ||\n !getIsCustomerInCall(interaction, mainCallId);\n\n const conferenceFromPayload =\n interaction.state === INTERACTION_STATE.CONFERENCE ||\n getIsConferenceInProgress(taskData) ||\n (interaction.state === INTERACTION_STATE.POST_CALL && customerLeft);\n if (!conferenceFromPayload) return false;\n\n return (\n taskData.consultingAgentId === selfAgentId ||\n interaction.owner === selfAgentId ||\n selfParticipant?.consultState === CONSULT_STATE.CONSULTING ||\n selfParticipant?.consultState === CONSULT_STATE.CONFERENCING ||\n selfParticipant?.consultState === 'consultInitiated'\n );\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param interaction - The interaction object\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n\n/**\n * Checks if the task belongs to a campaign preview interaction.\n * Campaign preview ContactEnded events are terminal cleanup events and should not trigger wrapup.\n */\nexport const isCampaignPreviewTask = (taskData?: TaskData | null): boolean => {\n const outboundType = taskData?.interaction?.outboundType ?? '';\n const cpd = taskData?.interaction?.callProcessingDetails as unknown as\n | Record<string, string | undefined>\n | undefined;\n const campaignType = cpd?.campaignType ?? '';\n\n return (\n CAMPAIGN_PREVIEW_OUTBOUND_TYPES.includes(outboundType) ||\n CAMPAIGN_PREVIEW_CAMPAIGN_TYPES.includes(campaignType)\n );\n};\n\n/**\n * Checks if auto-answer is enabled for the agent participant\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if auto-answer is enabled, false otherwise\n */\nexport const isAutoAnswerEnabled = (interaction: Interaction, agentId: string): boolean => {\n return interaction.participants?.[agentId]?.autoAnswerEnabled === true;\n};\n\n/**\n * Checks if the interaction is a WebRTC call eligible for auto-answer\n * @param interaction - The interaction object\n * @param loginOption - The agent's login option (BROWSER, AGENT_DN, etc.)\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if this is a WebRTC call, false otherwise\n */\nexport const isWebRTCCall = (\n interaction: Interaction,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n return (\n webRtcEnabled &&\n loginOption === LoginOption.BROWSER &&\n interaction.mediaType === OUTDIAL_MEDIA_TYPE\n );\n};\n\n/**\n * Checks if the interaction is a digital outbound (Email/SMS)\n * @param interaction - The interaction object\n * @returns true if this is a digital outbound, false otherwise\n */\nexport const isDigitalOutbound = (interaction: Interaction): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n (interaction.mediaChannel === MEDIA_CHANNEL.EMAIL ||\n interaction.mediaChannel === MEDIA_CHANNEL.SMS)\n );\n};\n\n/**\n * Checks if the outdial was initiated by the current agent\n * @param interaction - The interaction object\n * @param agentId - Current agent ID\n * @returns true if agent initiated the outdial, false otherwise\n */\nexport const hasAgentInitiatedOutdial = (interaction: Interaction, agentId: string): boolean => {\n return (\n interaction.contactDirection?.type === OUTDIAL_DIRECTION &&\n interaction.outboundType === OUTBOUND_TYPE &&\n interaction.callProcessingDetails?.outdialAgentId === agentId &&\n interaction.owner === agentId &&\n !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS\n );\n};\n\n/**\n * Determines if a task should be auto-answered based on interaction data\n * Auto-answer logic handles:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param taskData - The task data\n * @param agentId - Current agent ID\n * @param loginOption - Agent's login option\n * @param webRtcEnabled - Whether WebRTC is enabled for the agent\n * @returns true if task should be auto-answered, false otherwise\n */\nexport const shouldAutoAnswerTask = (\n taskData: TaskData,\n agentId: string,\n loginOption: string,\n webRtcEnabled: boolean\n): boolean => {\n const {interaction} = taskData;\n\n if (!interaction || !agentId) {\n return false;\n }\n\n // Check if auto-answer is enabled for this agent\n const autoAnswerEnabled = isAutoAnswerEnabled(interaction, agentId);\n\n // Check if this is an agent-initiated outdial\n const agentInitiatedOutdial = hasAgentInitiatedOutdial(interaction, agentId);\n\n // WebRTC telephony calls\n if (isWebRTCCall(interaction, loginOption, webRtcEnabled)) {\n return autoAnswerEnabled || agentInitiatedOutdial;\n }\n\n // Digital outbound (Email/SMS)\n if (isDigitalOutbound(interaction) && agentInitiatedOutdial) {\n // Don't auto-answer if task has been transferred (has previous vteams)\n const hasPreviousVteams = interaction.previousVTeams && interaction.previousVTeams.length > 0;\n\n return !hasPreviousVteams;\n }\n\n return false;\n};\n\n/**\n * Gets the consult media resource ID for switch-call operations.\n * Searches for the consult media leg in the interaction.\n *\n * @param interaction - The interaction object\n * @param consultMediaResourceId - The consult media resource ID from task data\n * @param agentId - Current agent ID\n * @returns The consult media resource ID or undefined\n */\nexport const getConsultMediaResourceId = (\n interaction: Interaction | undefined,\n consultMediaResourceId: string | undefined,\n agentId: string | undefined\n): string | undefined => {\n // First priority: use consultMediaResourceId from task data if available\n if (consultMediaResourceId) {\n return consultMediaResourceId;\n }\n\n // Second priority: search for consult media leg in interaction.media\n if (!interaction?.media || !agentId) {\n return undefined;\n }\n\n // Find the consult media leg where this agent is a participant\n for (const [mediaId, media] of Object.entries(interaction.media)) {\n if (media.mType === 'consult' && media.participants?.includes(agentId)) {\n return mediaId;\n }\n }\n\n return undefined;\n};\n\n/**\n * Checks if a task is a campaign preview reservation that has not yet been accepted.\n * Campaign preview tasks should not trigger incoming call handling until the agent\n * explicitly accepts the preview contact.\n * @param task - The task to check\n * @returns true if the task is a pending campaign preview reservation, false otherwise\n */\nexport const isCampaignPreviewReservation = (task: ITask): boolean => {\n return task?.data?.type === CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.decodedLineOwnerId = decodedLineOwnerId;
7
+ exports.getWebexCallingDeviceDetailsForAgent = getWebexCallingDeviceDetailsForAgent;
8
+ exports.isWebexCallingCallForAgent = isWebexCallingCallForAgent;
9
+ exports.isWxAppEngagedForControls = isWxAppEngagedForControls;
10
+ var _constants = require("./state-machine/constants");
11
+ const normalizeId = id => {
12
+ if (typeof id !== 'string') {
13
+ return undefined;
14
+ }
15
+ const normalizedId = id.trim();
16
+ return normalizedId === '' ? undefined : normalizedId;
17
+ };
18
+ const isParticipantsById = participants => Boolean(participants) && typeof participants === 'object' && !Array.isArray(participants) && !(participants instanceof Map);
19
+ const hasWebexCallingDeviceDetails = participant => {
20
+ const participantDetails = participant;
21
+ return typeof participantDetails?.deviceCallId === 'string' && participantDetails.deviceCallId.trim() !== '' && typeof participantDetails?.deviceId === 'string' && participantDetails.deviceId.trim() !== '';
22
+ };
23
+ const isWebexCallingParticipantForAgent = (participant, agentId) => {
24
+ const participantDetails = participant;
25
+ return normalizeId(participantDetails?.id) === agentId && hasWebexCallingDeviceDetails(participant);
26
+ };
27
+ const getWebexCallingDeviceDetails = participant => ({
28
+ deviceType: typeof participant.deviceType === 'string' ? participant.deviceType : '',
29
+ deviceId: participant.deviceId,
30
+ deviceCallId: participant.deviceCallId
31
+ });
32
+ function getWebexCallingDeviceDetailsForAgent(agentId, participants) {
33
+ const normalizedAgentId = normalizeId(agentId);
34
+ if (!normalizedAgentId || !isParticipantsById(participants)) {
35
+ return undefined;
36
+ }
37
+ const agentParticipant = participants[normalizedAgentId];
38
+ const matchingAgentParticipant = hasWebexCallingDeviceDetails(agentParticipant) ? agentParticipant : Object.values(participants).find(participant => isWebexCallingParticipantForAgent(participant, normalizedAgentId));
39
+ if (!matchingAgentParticipant || !hasWebexCallingDeviceDetails(matchingAgentParticipant)) {
40
+ return undefined;
41
+ }
42
+ return getWebexCallingDeviceDetails(matchingAgentParticipant);
43
+ }
44
+ function isWebexCallingCallForAgent(agentId, participants) {
45
+ return Boolean(getWebexCallingDeviceDetailsForAgent(agentId, participants));
46
+ }
47
+
48
+ /** Matches wxAppVoiceMethods.getWebexCallingCallId engaged semantics for uiControls. */
49
+ function isWxAppEngagedForControls(enableWxBetterTogether, agentId, participants, state) {
50
+ if (!enableWxBetterTogether) {
51
+ return false;
52
+ }
53
+ if (!state || state === _constants.TaskState.OFFERED || state === _constants.TaskState.IDLE || state === _constants.TaskState.WRAPPING_UP || state === _constants.TaskState.TERMINATED || state === _constants.TaskState.COMPLETED) {
54
+ return false;
55
+ }
56
+ const details = getWebexCallingDeviceDetailsForAgent(agentId, participants);
57
+ return details?.deviceType === 'wxApp';
58
+ }
59
+ function decodedLineOwnerId(lineOwnerId) {
60
+ if (!lineOwnerId) {
61
+ return undefined;
62
+ }
63
+ try {
64
+ const decoded = atob(lineOwnerId);
65
+ return decoded.split('/').pop();
66
+ } catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ //# sourceMappingURL=WebexCallingUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","normalizeId","id","undefined","normalizedId","trim","isParticipantsById","participants","Boolean","Array","isArray","Map","hasWebexCallingDeviceDetails","participant","participantDetails","deviceCallId","deviceId","isWebexCallingParticipantForAgent","agentId","getWebexCallingDeviceDetails","deviceType","getWebexCallingDeviceDetailsForAgent","normalizedAgentId","agentParticipant","matchingAgentParticipant","Object","values","find","isWebexCallingCallForAgent","isWxAppEngagedForControls","enableWxBetterTogether","state","TaskState","OFFERED","IDLE","WRAPPING_UP","TERMINATED","COMPLETED","details","decodedLineOwnerId","lineOwnerId","decoded","atob","split","pop"],"sources":["WebexCallingUtils.ts"],"sourcesContent":["import {TaskState} from './state-machine/constants';\n\nexport type WebexCallingDeviceDetails = {\n deviceType: string;\n deviceId: string;\n deviceCallId: string;\n};\n\ntype WebexCallingParticipant = {\n id?: unknown;\n deviceType?: unknown;\n deviceCallId?: unknown;\n deviceId?: unknown;\n};\n\nconst normalizeId = (id: unknown): string | undefined => {\n if (typeof id !== 'string') {\n return undefined;\n }\n\n const normalizedId = id.trim();\n\n return normalizedId === '' ? undefined : normalizedId;\n};\n\nconst isParticipantsById = (participants: unknown): participants is Record<string, unknown> =>\n Boolean(participants) &&\n typeof participants === 'object' &&\n !Array.isArray(participants) &&\n !(participants instanceof Map);\n\nconst hasWebexCallingDeviceDetails = (\n participant: unknown\n): participant is WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'> => {\n const participantDetails = participant as WebexCallingParticipant | undefined;\n\n return (\n typeof participantDetails?.deviceCallId === 'string' &&\n participantDetails.deviceCallId.trim() !== '' &&\n typeof participantDetails?.deviceId === 'string' &&\n participantDetails.deviceId.trim() !== ''\n );\n};\n\nconst isWebexCallingParticipantForAgent = (\n participant: unknown,\n agentId: string\n): participant is WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'> => {\n const participantDetails = participant as WebexCallingParticipant | undefined;\n\n return (\n normalizeId(participantDetails?.id) === agentId && hasWebexCallingDeviceDetails(participant)\n );\n};\n\nconst getWebexCallingDeviceDetails = (\n participant: WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'>\n): WebexCallingDeviceDetails => ({\n deviceType: typeof participant.deviceType === 'string' ? participant.deviceType : '',\n deviceId: participant.deviceId,\n deviceCallId: participant.deviceCallId,\n});\n\nexport function getWebexCallingDeviceDetailsForAgent(\n agentId: string | undefined,\n participants: unknown\n): WebexCallingDeviceDetails | undefined {\n const normalizedAgentId = normalizeId(agentId);\n if (!normalizedAgentId || !isParticipantsById(participants)) {\n return undefined;\n }\n\n const agentParticipant = participants[normalizedAgentId];\n const matchingAgentParticipant = hasWebexCallingDeviceDetails(agentParticipant)\n ? agentParticipant\n : Object.values(participants).find((participant) =>\n isWebexCallingParticipantForAgent(participant, normalizedAgentId)\n );\n\n if (!matchingAgentParticipant || !hasWebexCallingDeviceDetails(matchingAgentParticipant)) {\n return undefined;\n }\n\n return getWebexCallingDeviceDetails(matchingAgentParticipant);\n}\n\nexport function isWebexCallingCallForAgent(\n agentId: string | undefined,\n participants: unknown\n): boolean {\n return Boolean(getWebexCallingDeviceDetailsForAgent(agentId, participants));\n}\n\n/** Matches wxAppVoiceMethods.getWebexCallingCallId engaged semantics for uiControls. */\nexport function isWxAppEngagedForControls(\n enableWxBetterTogether: boolean,\n agentId: string | undefined,\n participants: unknown,\n state: TaskState\n): boolean {\n if (!enableWxBetterTogether) {\n return false;\n }\n\n if (\n !state ||\n state === TaskState.OFFERED ||\n state === TaskState.IDLE ||\n state === TaskState.WRAPPING_UP ||\n state === TaskState.TERMINATED ||\n state === TaskState.COMPLETED\n ) {\n return false;\n }\n\n const details = getWebexCallingDeviceDetailsForAgent(agentId, participants);\n\n return details?.deviceType === 'wxApp';\n}\n\nexport function decodedLineOwnerId(lineOwnerId?: string): string | undefined {\n if (!lineOwnerId) {\n return undefined;\n }\n\n try {\n const decoded = atob(lineOwnerId);\n\n return decoded.split('/').pop();\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WRAPUP = exports.UNHOLD = exports.TRANSFER = exports.TRANSCRIPT_EVENT_MAP = exports.TIMEOUT_PREVIEW_ACCEPT = exports.TASK_MESSAGE_TYPE = exports.TASK_MANAGER_FILE = exports.TASK_FILE = exports.TASK_API = exports.RESUME = exports.PRESERVED_TASK_DATA_FIELDS = exports.PAUSE = exports.METHODS = exports.KEYS_TO_NOT_DELETE = exports.HOLD = exports.END = exports.DIALER_API = exports.CONSULT_TRANSFER = exports.CONSULT_END = exports.CONSULT_CONFERENCE = exports.CONSULT_ACCEPT = exports.CONSULT = exports.CONFERENCE_TRANSFER = exports.CONFERENCE_EXIT = exports.CAMPAIGN_PREVIEW_ACCEPT = void 0;
6
+ exports.WRAPUP = exports.UNHOLD = exports.TRANSFER = exports.TRANSCRIPT_EVENT_MAP = exports.TIMEOUT_PREVIEW_ACCEPT = exports.TASK_MESSAGE_TYPE = exports.TASK_MANAGER_FILE = exports.TASK_FILE = exports.TASK_API = exports.RESUME = exports.PRESERVED_TASK_DATA_FIELDS = exports.PAUSE = exports.METHODS = exports.KEYS_TO_NOT_DELETE = exports.HOLD = exports.ENTRY_POINT_TRANSFER_DESTINATION_TYPE = exports.END = exports.DIALER_API = exports.CONSULT_TRANSFER = exports.CONSULT_END = exports.CONSULT_CONFERENCE = exports.CONSULT_ACCEPT = exports.CONSULT = exports.CONFERENCE_TRANSFER = exports.CONFERENCE_EXIT = exports.CAMPAIGN_PREVIEW_SKIP = exports.CAMPAIGN_PREVIEW_REMOVE = exports.CAMPAIGN_PREVIEW_ACCEPT = void 0;
7
7
  var _types = require("../config/types");
8
8
  /**
9
9
  * Constants for Task Service
@@ -19,6 +19,8 @@ const CONSULT = exports.CONSULT = '/consult';
19
19
  const CONSULT_ACCEPT = exports.CONSULT_ACCEPT = '/consult/accept';
20
20
  const CONSULT_END = exports.CONSULT_END = '/consult/end';
21
21
  const TRANSFER = exports.TRANSFER = '/transfer';
22
+ /** Backend destination value for direct entry-point transfers through the vteam endpoint. */
23
+ const ENTRY_POINT_TRANSFER_DESTINATION_TYPE = exports.ENTRY_POINT_TRANSFER_DESTINATION_TYPE = 'entrypointDialNumber';
22
24
  const CONSULT_TRANSFER = exports.CONSULT_TRANSFER = '/consult/transfer';
23
25
  const PAUSE = exports.PAUSE = '/record/pause';
24
26
  const RESUME = exports.RESUME = '/record/resume';
@@ -29,6 +31,8 @@ const CONFERENCE_EXIT = exports.CONFERENCE_EXIT = '/conference/exit';
29
31
  const CONFERENCE_TRANSFER = exports.CONFERENCE_TRANSFER = '/conference/transfer';
30
32
  const DIALER_API = exports.DIALER_API = '/v1/dialer';
31
33
  const CAMPAIGN_PREVIEW_ACCEPT = exports.CAMPAIGN_PREVIEW_ACCEPT = '/accept';
34
+ const CAMPAIGN_PREVIEW_SKIP = exports.CAMPAIGN_PREVIEW_SKIP = '/skip';
35
+ const CAMPAIGN_PREVIEW_REMOVE = exports.CAMPAIGN_PREVIEW_REMOVE = '/remove';
32
36
  /** 80-second timeout for accepting preview contact (outbound call setup takes longer than default 20s) */
33
37
  const TIMEOUT_PREVIEW_ACCEPT = exports.TIMEOUT_PREVIEW_ACCEPT = 80000;
34
38
  const TASK_MANAGER_FILE = exports.TASK_MANAGER_FILE = 'taskManager';
@@ -55,6 +59,10 @@ const PRESERVED_TASK_DATA_FIELDS = exports.PRESERVED_TASK_DATA_FIELDS = {
55
59
  */
56
60
  const KEYS_TO_NOT_DELETE = exports.KEYS_TO_NOT_DELETE = Object.values(PRESERVED_TASK_DATA_FIELDS);
57
61
 
62
+ /**
63
+ * Consultation status constants derived from state machine
64
+ * These values are computed and available in task.data.consultStatus
65
+ */
58
66
  // METHOD NAMES
59
67
  const METHODS = exports.METHODS = {
60
68
  // Task class methods
@@ -72,6 +80,7 @@ const METHODS = exports.METHODS = {
72
80
  TRANSFER: 'transfer',
73
81
  CONSULT_TRANSFER: 'consultTransfer',
74
82
  CONSULT_CONFERENCE: 'consultConference',
83
+ DROP_CONFERENCE_PARTICIPANT: 'dropConferenceParticipant',
75
84
  EXIT_CONFERENCE: 'exitConference',
76
85
  TRANSFER_CONFERENCE: 'transferConference',
77
86
  UPDATE_TASK_DATA: 'updateTaskData',
@@ -86,7 +95,8 @@ const METHODS = exports.METHODS = {
86
95
  GET_ALL_TASKS: 'getAllTasks',
87
96
  GET_TASK_MANAGER: 'getTaskManager',
88
97
  SETUP_AUTO_WRAPUP_TIMER: 'setupAutoWrapupTimer',
89
- CANCEL_AUTO_WRAPUP_TIMER: 'cancelAutoWrapupTimer'
98
+ CANCEL_AUTO_WRAPUP_TIMER: 'cancelAutoWrapupTimer',
99
+ REQUEST_REAL_TIME_TRANSCRIPTS: 'requestRealTimeTranscripts'
90
100
  };
91
101
  const TRANSCRIPT_EVENT_MAP = exports.TRANSCRIPT_EVENT_MAP = {
92
102
  [_types.CC_EVENTS.AGENT_CONTACT_ASSIGNED]: 'START',