@webex/contact-center 3.12.0-next.15 → 3.12.0-next.151

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 (322) hide show
  1. package/.sdd/manifest.json +887 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +62 -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 +1010 -47
  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 +40 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +54 -17
  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 +211 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +58 -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 +351 -14
  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 +225 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +111 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +48 -48
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +56 -78
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +100 -226
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +97 -24
  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 +955 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +50 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1272 -523
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +221 -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 +21 -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 +259 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1504 -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/wxAppOfferObservability.js +145 -0
  133. package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
  134. package/dist/services/task/voice/wxAppVoiceMethods.js +395 -0
  135. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  136. package/dist/services/wxAppDiagnosticLogging.js +159 -0
  137. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  138. package/dist/services/wxAppTelephonyUtils.js +19 -0
  139. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  140. package/dist/types/cc.d.ts +196 -9
  141. package/dist/types/config.d.ts +13 -0
  142. package/dist/types/constants.d.ts +38 -1
  143. package/dist/types/index.d.ts +54 -20
  144. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  145. package/dist/types/metrics/constants.d.ts +52 -1
  146. package/dist/types/services/AddressBook.d.ts +2 -1
  147. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  148. package/dist/types/services/ApiAiAssistant.d.ts +58 -5
  149. package/dist/types/services/EntryPoint.d.ts +7 -5
  150. package/dist/types/services/Queue.d.ts +5 -3
  151. package/dist/types/services/UserPreference.d.ts +118 -0
  152. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  153. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  154. package/dist/types/services/config/Util.d.ts +4 -8
  155. package/dist/types/services/config/constants.d.ts +49 -76
  156. package/dist/types/services/config/index.d.ts +16 -64
  157. package/dist/types/services/config/types.d.ts +248 -114
  158. package/dist/types/services/core/Err.d.ts +6 -0
  159. package/dist/types/services/core/Utils.d.ts +35 -13
  160. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  161. package/dist/types/services/core/types.d.ts +2 -0
  162. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  163. package/dist/types/services/core/websocket/types.d.ts +1 -1
  164. package/dist/types/services/index.d.ts +1 -1
  165. package/dist/types/services/task/Task.d.ts +186 -0
  166. package/dist/types/services/task/TaskFactory.d.ts +14 -0
  167. package/dist/types/services/task/TaskUtils.d.ts +54 -2
  168. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  169. package/dist/types/services/task/constants.d.ts +19 -0
  170. package/dist/types/services/task/contact.d.ts +4 -0
  171. package/dist/types/services/task/dialer.d.ts +30 -0
  172. package/dist/types/services/task/digital/Digital.d.ts +23 -0
  173. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  174. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  175. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  176. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  177. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  178. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  179. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  180. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  181. package/dist/types/services/task/types.d.ts +790 -66
  182. package/dist/types/services/task/voice/Voice.d.ts +241 -0
  183. package/dist/types/services/task/voice/WebRTC.d.ts +54 -0
  184. package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
  185. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +68 -0
  186. package/dist/types/services/wxAppDiagnosticLogging.d.ts +63 -0
  187. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  188. package/dist/types/types.d.ts +213 -11
  189. package/dist/types/utils/PageCache.d.ts +20 -3
  190. package/dist/types/webex.d.ts +1 -0
  191. package/dist/types.js +168 -6
  192. package/dist/types.js.map +1 -1
  193. package/dist/utils/PageCache.js +19 -5
  194. package/dist/utils/PageCache.js.map +1 -1
  195. package/dist/webex.js +22 -2
  196. package/dist/webex.js.map +1 -1
  197. package/package.json +16 -12
  198. package/src/cc.ts +1338 -121
  199. package/src/config.ts +13 -0
  200. package/src/constants.ts +41 -1
  201. package/src/index.ts +62 -15
  202. package/src/metrics/MetricsManager.ts +16 -0
  203. package/src/metrics/ai-docs/AGENTS.md +350 -0
  204. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  205. package/src/metrics/ai-docs/metrics-spec.md +971 -0
  206. package/src/metrics/behavioral-events.ts +218 -0
  207. package/src/metrics/constants.ts +63 -4
  208. package/src/services/AddressBook.ts +17 -6
  209. package/src/services/AnswerCallOnWebexService.ts +239 -0
  210. package/src/services/ApiAiAssistant.ts +470 -15
  211. package/src/services/EntryPoint.ts +59 -60
  212. package/src/services/Queue.ts +29 -12
  213. package/src/services/UserPreference.ts +509 -0
  214. package/src/services/WebexCrossClientService.ts +298 -0
  215. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  216. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  217. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  218. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  219. package/src/services/ai-docs/AGENTS.md +386 -0
  220. package/src/services/ai-docs/services-spec.md +505 -0
  221. package/src/services/config/Util.ts +54 -84
  222. package/src/services/config/ai-docs/AGENTS.md +250 -0
  223. package/src/services/config/ai-docs/ARCHITECTURE.md +413 -0
  224. package/src/services/config/ai-docs/config-spec.md +669 -0
  225. package/src/services/config/constants.ts +63 -85
  226. package/src/services/config/index.ts +116 -277
  227. package/src/services/config/types.ts +233 -125
  228. package/src/services/core/Err.ts +3 -0
  229. package/src/services/core/Utils.ts +127 -37
  230. package/src/services/core/WebexRequest.ts +3 -1
  231. package/src/services/core/ai-docs/AGENTS.md +381 -0
  232. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  233. package/src/services/core/ai-docs/core-spec.md +787 -0
  234. package/src/services/core/aqm-reqs.ts +30 -15
  235. package/src/services/core/types.ts +33 -1
  236. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  237. package/src/services/core/websocket/types.ts +1 -1
  238. package/src/services/index.ts +1 -1
  239. package/src/services/task/Task.ts +1211 -0
  240. package/src/services/task/TaskFactory.ts +82 -0
  241. package/src/services/task/TaskManager.ts +1584 -643
  242. package/src/services/task/TaskUtils.ts +316 -25
  243. package/src/services/task/WebexCallingUtils.ts +136 -0
  244. package/src/services/task/ai-docs/AGENTS.md +457 -0
  245. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  246. package/src/services/task/ai-docs/task-spec.md +1501 -0
  247. package/src/services/task/constants.ts +20 -0
  248. package/src/services/task/contact.ts +30 -0
  249. package/src/services/task/dialer.ts +80 -0
  250. package/src/services/task/digital/Digital.ts +102 -0
  251. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  252. package/src/services/task/state-machine/actions.ts +741 -0
  253. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  254. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  255. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  256. package/src/services/task/state-machine/constants.ts +172 -0
  257. package/src/services/task/state-machine/guards.ts +442 -0
  258. package/src/services/task/state-machine/index.ts +28 -0
  259. package/src/services/task/state-machine/types.ts +258 -0
  260. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  261. package/src/services/task/taskDataNormalizer.ts +137 -0
  262. package/src/services/task/types.ts +974 -70
  263. package/src/services/task/voice/Voice.ts +1878 -0
  264. package/src/services/task/voice/WebRTC.ts +194 -0
  265. package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
  266. package/src/services/task/voice/wxAppVoiceMethods.ts +575 -0
  267. package/src/services/wxAppDiagnosticLogging.ts +286 -0
  268. package/src/services/wxAppTelephonyUtils.ts +14 -0
  269. package/src/types.ts +272 -13
  270. package/src/utils/AGENTS.md +289 -0
  271. package/src/utils/PageCache.ts +38 -5
  272. package/src/utils/ai-docs/utils-spec.md +391 -0
  273. package/src/webex.js +10 -0
  274. package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
  275. package/test/unit/spec/cc.ts +3705 -150
  276. package/test/unit/spec/index.ts +885 -0
  277. package/test/unit/spec/logger-proxy.ts +70 -0
  278. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  279. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  280. package/test/unit/spec/services/AddressBook.ts +37 -6
  281. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  282. package/test/unit/spec/services/ApiAiAssistant.ts +429 -23
  283. package/test/unit/spec/services/EntryPoint.ts +87 -40
  284. package/test/unit/spec/services/Queue.ts +123 -12
  285. package/test/unit/spec/services/UserPreference.ts +401 -0
  286. package/test/unit/spec/services/WebCallingService.ts +7 -1
  287. package/test/unit/spec/services/WebexCrossClientService.ts +509 -0
  288. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  289. package/test/unit/spec/services/config/Util.ts +501 -0
  290. package/test/unit/spec/services/config/index.ts +317 -547
  291. package/test/unit/spec/services/core/Utils.ts +425 -8
  292. package/test/unit/spec/services/core/WebexRequest.ts +8 -7
  293. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  294. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  295. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  296. package/test/unit/spec/services/task/Task.ts +2723 -0
  297. package/test/unit/spec/services/task/TaskFactory.ts +116 -0
  298. package/test/unit/spec/services/task/TaskManager.ts +4781 -1585
  299. package/test/unit/spec/services/task/TaskUtils.ts +307 -0
  300. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  301. package/test/unit/spec/services/task/contact.ts +33 -0
  302. package/test/unit/spec/services/task/dialer.ts +190 -0
  303. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  304. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  305. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  306. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  307. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  308. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  309. package/test/unit/spec/services/task/voice/Voice.ts +2355 -0
  310. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  311. package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
  312. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +719 -0
  313. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +179 -0
  314. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  315. package/typedoc.md +1 -1
  316. package/umd/contact-center.min.js +2 -2
  317. package/umd/contact-center.min.js.map +1 -1
  318. package/dist/services/task/index.js +0 -1530
  319. package/dist/services/task/index.js.map +0 -1
  320. package/dist/types/services/task/index.d.ts +0 -650
  321. package/src/services/task/index.ts +0 -1806
  322. package/test/unit/spec/services/task/index.ts +0 -2205
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","_wxAppDiagnosticLogging","_stateMachine","_types","_wxAppVoiceMethods","WXAPP_PARTICIPANT_MISMATCH_GRACE_MS","exports","WxAppOfferObservability","lastLoggedWxAppParticipantMismatch","disposed","handleUiControlsUpdate","ctx","getEnableWxBetterTogether","cancelGraceTimer","state","getTaskState","TaskState","OFFERED","accept","getAcceptControl","isVisible","deps","getWxAppVoiceDependencies","isOutdial","isWxAppInboundOffer","isWxAppOutdialOffer","isWxAppCallingOffer","deviceDetails","getCallingDeviceDetails","participantDiagnostics","getWxAppParticipantDiagnostics","usersubPublished","getUsersubPublished","acceptReason","deriveWxAppAcceptReason","isWebrtc","getVoiceVariant","VOICE_VARIANT","WEBRTC","wxAppAcceptInFlight","getWxAppAcceptInFlight","wxAppAnswerPending","getWxAppAnswerPending","enableWxBetterTogether","hasDeviceCallId","lastLoggedWxAppAcceptReason","logWxAppOfferDecision","interactionId","getInteractionId","acceptVisible","acceptEnabled","isEnabled","wxAppParticipantDeviceType","deviceType","participantDeviceType","hasDeviceId","hasValidWxAppParticipant","scheduleGraceTimer","dispose","wxAppParticipantMismatchGraceTimer","undefined","clearTimeout","setTimeout","emitParticipantMismatchIfStillNeeded","logWxAppOfferParticipantMismatch","getMetricsManager","trackEvent","METRIC_EVENT_NAMES","WXAPP_OFFER_PARTICIPANT_FIELDS_MISSING","taskId"],"sources":["wxAppOfferObservability.ts"],"sourcesContent":["import MetricsManager from '../../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../../metrics/constants';\nimport {\n deriveWxAppAcceptReason,\n logWxAppOfferDecision,\n logWxAppOfferParticipantMismatch,\n WxAppAcceptReason,\n} from '../../wxAppDiagnosticLogging';\nimport {TaskState} from '../state-machine';\nimport {VoiceVariant, VOICE_VARIANT} from '../types';\nimport {\n getCallingDeviceDetails,\n getWxAppParticipantDiagnostics,\n WxAppVoiceDependencies,\n} from './wxAppVoiceMethods';\n\n/** Defer mismatch WARN/metric so transient WS ordering gaps (~200–300 ms) do not false-alarm. */\nexport const WXAPP_PARTICIPANT_MISMATCH_GRACE_MS = 500;\n\nexport type WxAppOfferObservabilityContext = {\n getInteractionId: () => string;\n getTaskState: () => TaskState | undefined;\n getAcceptControl: () => {isVisible: boolean; isEnabled: boolean} | undefined;\n getVoiceVariant: () => VoiceVariant;\n isOutdial: () => boolean;\n isWxAppInboundOffer: () => boolean;\n isWxAppCallingOffer: () => boolean;\n getWxAppAcceptInFlight: () => boolean;\n getWxAppAnswerPending: () => boolean;\n getEnableWxBetterTogether: () => boolean;\n getUsersubPublished: () => boolean;\n getWxAppVoiceDependencies: () => WxAppVoiceDependencies;\n getMetricsManager: () => MetricsManager;\n};\n\n/**\n * OFFERED-state wxApp offer diagnostics: acceptReason logging and deferred participant mismatch.\n * Invoked from Voice.updateUiControls — observability only.\n */\nexport class WxAppOfferObservability {\n private lastLoggedWxAppAcceptReason?: WxAppAcceptReason;\n private lastLoggedWxAppParticipantMismatch = false;\n private wxAppParticipantMismatchGraceTimer?: ReturnType<typeof setTimeout>;\n private disposed = false;\n\n public handleUiControlsUpdate(ctx: WxAppOfferObservabilityContext): void {\n if (this.disposed) {\n return;\n }\n\n if (!ctx.getEnableWxBetterTogether()) {\n this.cancelGraceTimer();\n\n return;\n }\n\n const state = ctx.getTaskState();\n if (state !== TaskState.OFFERED) {\n this.cancelGraceTimer();\n\n return;\n }\n\n const accept = ctx.getAcceptControl();\n if (!accept?.isVisible) {\n return;\n }\n\n const deps = ctx.getWxAppVoiceDependencies();\n const isOutdial = ctx.isOutdial();\n const isWxAppInboundOffer = ctx.isWxAppInboundOffer();\n const isWxAppOutdialOffer = ctx.isWxAppCallingOffer() && isOutdial;\n const deviceDetails = getCallingDeviceDetails(deps);\n const participantDiagnostics = getWxAppParticipantDiagnostics(deps);\n const usersubPublished = ctx.getUsersubPublished();\n const acceptReason = deriveWxAppAcceptReason({\n isWxAppInboundOffer,\n isWxAppOutdialOffer,\n isWebrtc: ctx.getVoiceVariant() === VOICE_VARIANT.WEBRTC,\n isOutdial,\n wxAppAcceptInFlight: ctx.getWxAppAcceptInFlight(),\n wxAppAnswerPending: ctx.getWxAppAnswerPending(),\n enableWxBetterTogether: ctx.getEnableWxBetterTogether(),\n hasDeviceCallId: participantDiagnostics.hasDeviceCallId,\n });\n\n if (acceptReason !== this.lastLoggedWxAppAcceptReason) {\n this.lastLoggedWxAppAcceptReason = acceptReason;\n\n logWxAppOfferDecision({\n interactionId: ctx.getInteractionId(),\n acceptVisible: accept.isVisible,\n acceptEnabled: accept.isEnabled,\n acceptReason,\n wxAppParticipantDeviceType:\n deviceDetails?.deviceType ?? participantDiagnostics.participantDeviceType,\n hasDeviceCallId: participantDiagnostics.hasDeviceCallId,\n hasDeviceId: participantDiagnostics.hasDeviceId,\n usersubPublished,\n });\n }\n\n if (participantDiagnostics.hasValidWxAppParticipant || !usersubPublished) {\n this.cancelGraceTimer();\n } else if (!ctx.isOutdial() && !this.lastLoggedWxAppParticipantMismatch) {\n this.scheduleGraceTimer(ctx);\n }\n }\n\n public dispose(): void {\n this.disposed = true;\n this.cancelGraceTimer();\n }\n\n private cancelGraceTimer(): void {\n if (this.wxAppParticipantMismatchGraceTimer !== undefined) {\n clearTimeout(this.wxAppParticipantMismatchGraceTimer);\n this.wxAppParticipantMismatchGraceTimer = undefined;\n }\n }\n\n private scheduleGraceTimer(ctx: WxAppOfferObservabilityContext): void {\n if (\n this.disposed ||\n this.lastLoggedWxAppParticipantMismatch ||\n this.wxAppParticipantMismatchGraceTimer !== undefined\n ) {\n return;\n }\n\n this.wxAppParticipantMismatchGraceTimer = setTimeout(() => {\n this.wxAppParticipantMismatchGraceTimer = undefined;\n this.emitParticipantMismatchIfStillNeeded(ctx);\n }, WXAPP_PARTICIPANT_MISMATCH_GRACE_MS);\n }\n\n private emitParticipantMismatchIfStillNeeded(ctx: WxAppOfferObservabilityContext): void {\n if (\n this.disposed ||\n !ctx.getEnableWxBetterTogether() ||\n this.lastLoggedWxAppParticipantMismatch\n ) {\n return;\n }\n\n if (ctx.isOutdial()) {\n return;\n }\n\n if (ctx.getTaskState() !== TaskState.OFFERED) {\n return;\n }\n\n const accept = ctx.getAcceptControl();\n if (!accept?.isVisible) {\n return;\n }\n\n const deps = ctx.getWxAppVoiceDependencies();\n const participantDiagnostics = getWxAppParticipantDiagnostics(deps);\n const usersubPublished = ctx.getUsersubPublished();\n\n if (!usersubPublished || participantDiagnostics.hasValidWxAppParticipant) {\n return;\n }\n\n const isOutdial = ctx.isOutdial();\n const acceptReason = deriveWxAppAcceptReason({\n isWxAppInboundOffer: ctx.isWxAppInboundOffer(),\n isWxAppOutdialOffer: ctx.isWxAppCallingOffer() && isOutdial,\n isWebrtc: ctx.getVoiceVariant() === VOICE_VARIANT.WEBRTC,\n isOutdial,\n wxAppAcceptInFlight: ctx.getWxAppAcceptInFlight(),\n wxAppAnswerPending: ctx.getWxAppAnswerPending(),\n enableWxBetterTogether: ctx.getEnableWxBetterTogether(),\n hasDeviceCallId: participantDiagnostics.hasDeviceCallId,\n });\n\n this.lastLoggedWxAppParticipantMismatch = true;\n\n logWxAppOfferParticipantMismatch({\n interactionId: ctx.getInteractionId(),\n usersubPublished,\n hasDeviceCallId: participantDiagnostics.hasDeviceCallId,\n hasDeviceId: participantDiagnostics.hasDeviceId,\n participantDeviceType: participantDiagnostics.participantDeviceType,\n acceptVisible: accept.isVisible,\n acceptEnabled: accept.isEnabled,\n acceptReason,\n });\n\n ctx.getMetricsManager().trackEvent(\n METRIC_EVENT_NAMES.WXAPP_OFFER_PARTICIPANT_FIELDS_MISSING,\n {\n taskId: ctx.getInteractionId(),\n usersubPublished,\n hasDeviceCallId: participantDiagnostics.hasDeviceCallId,\n hasDeviceId: participantDiagnostics.hasDeviceId,\n acceptReason,\n },\n ['operational', 'behavioral']\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,395 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.acceptOnWebex = acceptOnWebex;
7
+ exports.getCallingDeviceDetails = getCallingDeviceDetails;
8
+ exports.getWebexCallingCallId = getWebexCallingCallId;
9
+ exports.getWxAppLineOwnerId = getWxAppLineOwnerId;
10
+ exports.getWxAppParticipantDiagnostics = getWxAppParticipantDiagnostics;
11
+ exports.isWebexAppCallingOffer = isWebexAppCallingOffer;
12
+ exports.isWebexAppInboundCallingOffer = isWebexAppInboundCallingOffer;
13
+ exports.mapWxAppVoiceError = mapWxAppVoiceError;
14
+ exports.rejectOnWebex = rejectOnWebex;
15
+ exports.resolveWxAppLineOwnerId = resolveWxAppLineOwnerId;
16
+ exports.runWxAppAccept = runWxAppAccept;
17
+ exports.runWxAppOutdialDecline = runWxAppOutdialDecline;
18
+ exports.runWxAppReject = runWxAppReject;
19
+ exports.runWxAppToggleMute = runWxAppToggleMute;
20
+ exports.runWxAppTransmitDtmf = runWxAppTransmitDtmf;
21
+ exports.toggleMuteOnWebex = toggleMuteOnWebex;
22
+ exports.transmitDtmfOnWebex = transmitDtmfOnWebex;
23
+ var _loggerProxy = _interopRequireDefault(require("../../../logger-proxy"));
24
+ var _constants = require("../../../constants");
25
+ var _Utils = require("../../core/Utils");
26
+ var _stateMachine = require("../state-machine");
27
+ var _MetricsManager = _interopRequireDefault(require("../../../metrics/MetricsManager"));
28
+ var _constants2 = require("../../../metrics/constants");
29
+ var _WebexCallingUtils = require("../WebexCallingUtils");
30
+ var _wxAppDiagnosticLogging = require("../../wxAppDiagnosticLogging");
31
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
+ /** @deprecated Use {@link WxAppVoiceDependencies} */
33
+
34
+ const isWxAppParticipant = participant => participant?.deviceType === 'wxApp' && typeof participant?.deviceCallId === 'string' && participant.deviceCallId.trim() !== '' && typeof participant?.deviceId === 'string' && participant.deviceId.trim() !== '';
35
+ const isOutdialTask = deps => deps.getTaskData()?.interaction?.outboundType === 'OUTDIAL';
36
+ function getWxAppAgentParticipant(deps) {
37
+ const taskData = deps.getTaskData();
38
+ const participants = taskData.interaction?.participants;
39
+ const agentId = deps.agentId ?? taskData.agentId;
40
+ if (!participants || !agentId) {
41
+ return undefined;
42
+ }
43
+ if (participants[agentId]) {
44
+ return participants[agentId];
45
+ }
46
+ return Object.values(participants).find(participant => participant?.id === agentId);
47
+ }
48
+ function getWxAppParticipantDiagnostics(deps) {
49
+ const participant = getWxAppAgentParticipant(deps);
50
+ const hasDeviceCallId = typeof participant?.deviceCallId === 'string' && participant.deviceCallId.trim() !== '';
51
+ const hasDeviceId = typeof participant?.deviceId === 'string' && participant.deviceId.trim() !== '';
52
+ return {
53
+ participantDeviceType: participant?.deviceType,
54
+ hasDeviceCallId,
55
+ hasDeviceId,
56
+ hasValidWxAppParticipant: isWxAppParticipant(participant)
57
+ };
58
+ }
59
+ function getWxAppTelephonyMetricContext(deps) {
60
+ const diagnostics = getWxAppParticipantDiagnostics(deps);
61
+ return {
62
+ hasDeviceCallId: diagnostics.hasDeviceCallId,
63
+ hasDeviceId: diagnostics.hasDeviceId
64
+ };
65
+ }
66
+ function getCallingDeviceDetails(deps) {
67
+ const taskData = deps.getTaskData();
68
+ const participant = getWxAppAgentParticipant(deps);
69
+ if (!isWxAppParticipant(participant)) {
70
+ return undefined;
71
+ }
72
+ return (0, _WebexCallingUtils.getWebexCallingDeviceDetailsForAgent)(deps.agentId ?? taskData.agentId, taskData.interaction?.participants);
73
+ }
74
+ function isWebexAppCallingOffer(deps) {
75
+ if (!deps.enableWxBetterTogether) {
76
+ return false;
77
+ }
78
+ const state = deps.getTaskState();
79
+ if (state !== _stateMachine.TaskState.OFFERED) {
80
+ return false;
81
+ }
82
+ const details = getCallingDeviceDetails(deps);
83
+ return Boolean(details);
84
+ }
85
+
86
+ /** Inbound wxApp offer only — outdial decline uses CC routing, not telephony reject. */
87
+ function isWebexAppInboundCallingOffer(deps) {
88
+ return isWebexAppCallingOffer(deps) && !isOutdialTask(deps);
89
+ }
90
+ function getWebexCallingCallId(deps) {
91
+ const state = deps.getTaskState();
92
+ if (!state || state === _stateMachine.TaskState.OFFERED || state === _stateMachine.TaskState.IDLE || state === _stateMachine.TaskState.WRAPPING_UP || state === _stateMachine.TaskState.TERMINATED || state === _stateMachine.TaskState.COMPLETED) {
93
+ return null;
94
+ }
95
+ return getCallingDeviceDetails(deps)?.deviceCallId ?? null;
96
+ }
97
+ function getWxAppLineOwnerId(deps) {
98
+ const participant = getWxAppAgentParticipant(deps);
99
+ const lineOwnerId = participant?.lineOwnerId;
100
+ return typeof lineOwnerId === 'string' && lineOwnerId.trim() !== '' ? lineOwnerId : undefined;
101
+ }
102
+ function resolveWxAppLineOwnerId(deps, override) {
103
+ if (typeof override === 'string' && override.trim() !== '') {
104
+ return override;
105
+ }
106
+ return (0, _WebexCallingUtils.decodedLineOwnerId)(getWxAppLineOwnerId(deps));
107
+ }
108
+ function getInteractionId(deps) {
109
+ return deps.getTaskData()?.interactionId;
110
+ }
111
+ function logTelephonyFailure(action, deps, error) {
112
+ const wxError = error;
113
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
114
+ action,
115
+ phase: 'failed',
116
+ interactionId: getInteractionId(deps),
117
+ trackingId: wxError.trackingId,
118
+ httpStatus: wxError.status,
119
+ failureReason: wxError.message
120
+ });
121
+ }
122
+ function getWxAppTelephonyMetricFailurePayload(deps, error) {
123
+ const wxError = error;
124
+ const payload = {
125
+ taskId: getInteractionId(deps) ?? '',
126
+ error: error instanceof Error ? error.toString() : String(error),
127
+ ...getWxAppTelephonyMetricContext(deps)
128
+ };
129
+ if (wxError.trackingId) {
130
+ payload.trackingId = wxError.trackingId;
131
+ }
132
+ return payload;
133
+ }
134
+ function getWxAppOutdialDeclineFailurePayload(deps, error) {
135
+ const base = {
136
+ taskId: getInteractionId(deps) ?? '',
137
+ error: error instanceof Error ? error.toString() : String(error)
138
+ };
139
+ const aqmDetails = error.details;
140
+ if (aqmDetails) {
141
+ return {
142
+ ...base,
143
+ ...getWxAppTelephonyMetricContext(deps),
144
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(aqmDetails)
145
+ };
146
+ }
147
+ return getWxAppTelephonyMetricFailurePayload(deps, error);
148
+ }
149
+ function logWxAppOutdialDeclineFailure(deps, error) {
150
+ const aqmDetails = error.details;
151
+ const wxError = error;
152
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
153
+ action: 'decline',
154
+ phase: 'failed',
155
+ interactionId: getInteractionId(deps),
156
+ trackingId: aqmDetails?.trackingId ?? wxError.trackingId,
157
+ httpStatus: wxError.status,
158
+ failureReason: aqmDetails?.data?.reason ?? wxError.message
159
+ });
160
+ }
161
+ function assertWxAppEnabled(deps) {
162
+ if (!deps.enableWxBetterTogether) {
163
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('enableWxBetterTogether_disabled', getInteractionId(deps));
164
+ throw new Error('enableWxBetterTogether is disabled');
165
+ }
166
+ if (!deps.answerCallOnWebexService) {
167
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('answer_call_on_webex_service_unavailable', getInteractionId(deps));
168
+ throw new Error('AnswerCallOnWebexService is unavailable');
169
+ }
170
+ }
171
+ async function acceptOnWebex(deps, options) {
172
+ const interactionId = getInteractionId(deps);
173
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
174
+ action: 'accept',
175
+ phase: 'started',
176
+ interactionId
177
+ });
178
+ assertWxAppEnabled(deps);
179
+ if (!isWebexAppCallingOffer(deps)) {
180
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('not_wxApp_calling_offer', interactionId);
181
+ throw new Error('Task is not a wxApp calling offer');
182
+ }
183
+ const details = getCallingDeviceDetails(deps);
184
+ if (!details) {
185
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_device_details_unavailable', interactionId);
186
+ throw new Error('WxApp calling device details are unavailable');
187
+ }
188
+ await deps.answerCallOnWebexService.answerCall({
189
+ callId: details.deviceCallId,
190
+ endpointId: details.deviceId,
191
+ lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
192
+ });
193
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
194
+ action: 'accept',
195
+ phase: 'success',
196
+ interactionId
197
+ });
198
+ }
199
+ async function rejectOnWebex(deps, options) {
200
+ const interactionId = getInteractionId(deps);
201
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
202
+ action: 'decline',
203
+ phase: 'started',
204
+ interactionId
205
+ });
206
+ assertWxAppEnabled(deps);
207
+ if (!isWebexAppInboundCallingOffer(deps)) {
208
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('not_wxApp_inbound_calling_offer', interactionId);
209
+ throw new Error('Task is not a wxApp inbound calling offer');
210
+ }
211
+ const details = getCallingDeviceDetails(deps);
212
+ if (!details) {
213
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_device_details_unavailable', interactionId);
214
+ throw new Error('WxApp calling device details are unavailable');
215
+ }
216
+ await deps.answerCallOnWebexService.rejectCall({
217
+ callId: details.deviceCallId,
218
+ lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
219
+ });
220
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
221
+ action: 'decline',
222
+ phase: 'success',
223
+ interactionId
224
+ });
225
+ }
226
+ async function toggleMuteOnWebex(deps, options) {
227
+ const interactionId = getInteractionId(deps);
228
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
229
+ action: 'mute',
230
+ phase: 'started',
231
+ interactionId
232
+ });
233
+ assertWxAppEnabled(deps);
234
+ const callId = getWebexCallingCallId(deps);
235
+ if (!callId) {
236
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_call_id_unavailable', interactionId);
237
+ throw new Error('WxApp call ID is unavailable');
238
+ }
239
+ const targetMuted = options?.muted ?? !deps.getWxAppMuted();
240
+ const request = targetMuted ? deps.answerCallOnWebexService.muteCall.bind(deps.answerCallOnWebexService) : deps.answerCallOnWebexService.unmuteCall.bind(deps.answerCallOnWebexService);
241
+ await request({
242
+ callId,
243
+ lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
244
+ });
245
+ deps.setWxAppMuted(targetMuted);
246
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
247
+ action: 'mute',
248
+ phase: 'success',
249
+ interactionId
250
+ });
251
+ }
252
+ async function transmitDtmfOnWebex(deps, options) {
253
+ const interactionId = getInteractionId(deps);
254
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
255
+ action: 'dtmf',
256
+ phase: 'started',
257
+ interactionId
258
+ });
259
+ assertWxAppEnabled(deps);
260
+ const callId = getWebexCallingCallId(deps);
261
+ if (!callId) {
262
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_call_id_unavailable', interactionId);
263
+ throw new Error('WxApp call ID is unavailable');
264
+ }
265
+ _loggerProxy.default.log('transmitDtmf', {
266
+ module: 'wxAppVoiceMethods',
267
+ method: _constants.METHODS.TRANSMIT_DTMF,
268
+ data: {
269
+ interactionId,
270
+ callIdSuffix: callId.length <= 8 ? callId : callId.slice(-8),
271
+ dtmfLength: options.dtmf.length,
272
+ hasLineOwnerId: Boolean(options.lineOwnerId)
273
+ }
274
+ });
275
+ await deps.answerCallOnWebexService.transmitDtmf({
276
+ callId,
277
+ dtmf: options.dtmf,
278
+ lineOwnerId: resolveWxAppLineOwnerId(deps, options.lineOwnerId)
279
+ });
280
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
281
+ action: 'dtmf',
282
+ phase: 'success',
283
+ interactionId
284
+ });
285
+ }
286
+ async function runWxAppAccept(deps, lifecycle, options) {
287
+ const taskId = getInteractionId(deps);
288
+ const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';
289
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED]);
290
+ try {
291
+ lifecycle.setWxAppAcceptInFlight(true);
292
+ lifecycle.setWxAppAnswerPending(true);
293
+ await acceptOnWebex(deps, options);
294
+ lifecycle.resetWxAppMuted();
295
+ await lifecycle.syncWxAppMuteFromCallDetails();
296
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS, {
297
+ taskId,
298
+ acceptReason,
299
+ ...getWxAppTelephonyMetricContext(deps)
300
+ }, ['operational', 'behavioral']);
301
+ } catch (error) {
302
+ lifecycle.setWxAppAnswerPending(false);
303
+ logTelephonyFailure('accept', deps, error);
304
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED, {
305
+ acceptReason,
306
+ ...getWxAppTelephonyMetricFailurePayload(deps, error)
307
+ }, ['operational', 'behavioral']);
308
+ lifecycle.mapWxAppVoiceError(error, _constants.METHODS.ACCEPT);
309
+ } finally {
310
+ lifecycle.setWxAppAcceptInFlight(false);
311
+ }
312
+ }
313
+ async function runWxAppReject(deps, lifecycle, options) {
314
+ const taskId = getInteractionId(deps);
315
+ const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';
316
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]);
317
+ try {
318
+ await rejectOnWebex(deps, options);
319
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {
320
+ taskId,
321
+ acceptReason,
322
+ ...getWxAppTelephonyMetricContext(deps)
323
+ }, ['operational', 'behavioral']);
324
+ } catch (error) {
325
+ logTelephonyFailure('decline', deps, error);
326
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED, {
327
+ acceptReason,
328
+ ...getWxAppTelephonyMetricFailurePayload(deps, error)
329
+ }, ['operational', 'behavioral']);
330
+ lifecycle.mapWxAppVoiceError(error, _constants.METHODS.REJECT);
331
+ }
332
+ }
333
+ async function runWxAppOutdialDecline(deps, executeCancel, options) {
334
+ const taskId = getInteractionId(deps);
335
+ const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';
336
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]);
337
+ try {
338
+ const result = await executeCancel();
339
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {
340
+ taskId,
341
+ acceptReason,
342
+ ...getWxAppTelephonyMetricContext(deps)
343
+ }, ['operational', 'behavioral']);
344
+ return result;
345
+ } catch (error) {
346
+ logWxAppOutdialDeclineFailure(deps, error);
347
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED, {
348
+ acceptReason,
349
+ ...getWxAppOutdialDeclineFailurePayload(deps, error)
350
+ }, ['operational', 'behavioral']);
351
+ throw error;
352
+ }
353
+ }
354
+ async function runWxAppToggleMute(deps, lifecycle, options) {
355
+ const taskId = getInteractionId(deps);
356
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED]);
357
+ try {
358
+ await toggleMuteOnWebex(deps, options);
359
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS, {
360
+ taskId,
361
+ targetMuted: deps.getWxAppMuted(),
362
+ ...getWxAppTelephonyMetricContext(deps)
363
+ }, ['operational', 'behavioral']);
364
+ } catch (error) {
365
+ logTelephonyFailure('mute', deps, error);
366
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
367
+ lifecycle.mapWxAppVoiceError(error, _constants.METHODS.TOGGLE_MUTE);
368
+ }
369
+ }
370
+ async function runWxAppTransmitDtmf(deps, lifecycle, options) {
371
+ const taskId = getInteractionId(deps);
372
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED]);
373
+ try {
374
+ await transmitDtmfOnWebex(deps, options);
375
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS, {
376
+ taskId,
377
+ dtmfLength: options.dtmf.length,
378
+ ...getWxAppTelephonyMetricContext(deps)
379
+ }, ['operational', 'behavioral']);
380
+ } catch (error) {
381
+ logTelephonyFailure('dtmf', deps, error);
382
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
383
+ lifecycle.mapWxAppVoiceError(error, _constants.METHODS.TRANSMIT_DTMF);
384
+ }
385
+ }
386
+ function mapWxAppVoiceError(error, method, module) {
387
+ if (error instanceof Error && error.isWxAppTelephonyError) {
388
+ throw error;
389
+ }
390
+ const {
391
+ error: detailedError
392
+ } = (0, _Utils.getErrorDetails)(error, method, module);
393
+ throw detailedError;
394
+ }
395
+ //# sourceMappingURL=wxAppVoiceMethods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_Utils","_stateMachine","_MetricsManager","_constants2","_WebexCallingUtils","_wxAppDiagnosticLogging","e","__esModule","default","isWxAppParticipant","participant","deviceType","deviceCallId","trim","deviceId","isOutdialTask","deps","getTaskData","interaction","outboundType","getWxAppAgentParticipant","taskData","participants","agentId","undefined","Object","values","find","id","getWxAppParticipantDiagnostics","hasDeviceCallId","hasDeviceId","participantDeviceType","hasValidWxAppParticipant","getWxAppTelephonyMetricContext","diagnostics","getCallingDeviceDetails","getWebexCallingDeviceDetailsForAgent","isWebexAppCallingOffer","enableWxBetterTogether","state","getTaskState","TaskState","OFFERED","details","Boolean","isWebexAppInboundCallingOffer","getWebexCallingCallId","IDLE","WRAPPING_UP","TERMINATED","COMPLETED","getWxAppLineOwnerId","lineOwnerId","resolveWxAppLineOwnerId","override","decodedLineOwnerId","getInteractionId","interactionId","logTelephonyFailure","action","error","wxError","logWxAppTelephonyAction","phase","trackingId","httpStatus","status","failureReason","message","getWxAppTelephonyMetricFailurePayload","payload","taskId","Error","toString","String","getWxAppOutdialDeclineFailurePayload","base","aqmDetails","MetricsManager","getCommonTrackingFieldForAQMResponseFailed","logWxAppOutdialDeclineFailure","data","reason","assertWxAppEnabled","logWxAppValidationFailure","answerCallOnWebexService","acceptOnWebex","options","answerCall","callId","endpointId","rejectOnWebex","rejectCall","toggleMuteOnWebex","targetMuted","muted","getWxAppMuted","request","muteCall","bind","unmuteCall","setWxAppMuted","transmitDtmfOnWebex","LoggerProxy","log","module","method","METHODS","TRANSMIT_DTMF","callIdSuffix","length","slice","dtmfLength","dtmf","hasLineOwnerId","transmitDtmf","runWxAppAccept","lifecycle","acceptReason","metricsManager","timeEvent","METRIC_EVENT_NAMES","WXAPP_TASK_ACCEPT_SUCCESS","WXAPP_TASK_ACCEPT_FAILED","setWxAppAcceptInFlight","setWxAppAnswerPending","resetWxAppMuted","syncWxAppMuteFromCallDetails","trackEvent","mapWxAppVoiceError","ACCEPT","runWxAppReject","WXAPP_TASK_DECLINE_SUCCESS","WXAPP_TASK_DECLINE_FAILED","REJECT","runWxAppOutdialDecline","executeCancel","result","runWxAppToggleMute","WXAPP_TASK_MUTE_SUCCESS","WXAPP_TASK_MUTE_FAILED","TOGGLE_MUTE","runWxAppTransmitDtmf","WXAPP_TASK_DTMF_SUCCESS","WXAPP_TASK_DTMF_FAILED","isWxAppTelephonyError","detailedError","getErrorDetails"],"sources":["wxAppVoiceMethods.ts"],"sourcesContent":["import {EventPayload} from '@webex/internal-plugin-metrics/src/metrics.types';\n\nimport AnswerCallOnWebexService, {WxAppTelephonyError} from '../../AnswerCallOnWebexService';\nimport LoggerProxy from '../../../logger-proxy';\nimport {METHODS} from '../../../constants';\nimport {getErrorDetails} from '../../core/Utils';\nimport {Failure} from '../../core/GlobalTypes';\nimport {TaskData, TaskToggleMuteOptions, TaskTransmitDtmfOptions} from '../types';\nimport {TaskState} from '../state-machine';\nimport MetricsManager from '../../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../../metrics/constants';\nimport {\n decodedLineOwnerId,\n getWebexCallingDeviceDetailsForAgent,\n WebexCallingDeviceDetails,\n} from '../WebexCallingUtils';\nimport {\n logWxAppTelephonyAction,\n logWxAppValidationFailure,\n type WxAppAcceptReason,\n type WxAppTelephonyAction,\n} from '../../wxAppDiagnosticLogging';\n\ntype WxAppParticipant = {\n deviceType?: string;\n deviceCallId?: string;\n deviceId?: string;\n};\n\nexport type WxAppVoiceDependencies = {\n enableWxBetterTogether: boolean;\n answerCallOnWebexService?: AnswerCallOnWebexService;\n agentId?: string;\n metricsManager: MetricsManager;\n getTaskData: () => TaskData;\n getTaskState: () => TaskState | undefined;\n getWxAppMuted: () => boolean;\n setWxAppMuted: (muted: boolean) => void;\n /** Read-only observability: whether usersub answer-calls-on-wxcc is active this session. */\n getUsersubPublished?: () => boolean;\n};\n\nexport type WxAppParticipantDiagnostics = {\n participantDeviceType?: string;\n hasDeviceCallId: boolean;\n hasDeviceId: boolean;\n hasValidWxAppParticipant: boolean;\n};\n\n/** @deprecated Use {@link WxAppVoiceDependencies} */\nexport type WxAppVoiceDeps = WxAppVoiceDependencies;\n\nexport type WxAppVoiceLifecycle = {\n setWxAppAcceptInFlight: (inFlight: boolean) => void;\n setWxAppAnswerPending: (pending: boolean) => void;\n resetWxAppMuted: () => void;\n syncWxAppMuteFromCallDetails: () => Promise<boolean | undefined>;\n mapWxAppVoiceError: (error: unknown, method: string) => never;\n};\n\nconst isWxAppParticipant = (participant: unknown): participant is WxAppParticipant =>\n (participant as WxAppParticipant)?.deviceType === 'wxApp' &&\n typeof (participant as WxAppParticipant)?.deviceCallId === 'string' &&\n (participant as WxAppParticipant).deviceCallId.trim() !== '' &&\n typeof (participant as WxAppParticipant)?.deviceId === 'string' &&\n (participant as WxAppParticipant).deviceId.trim() !== '';\n\nconst isOutdialTask = (deps: WxAppVoiceDependencies): boolean =>\n deps.getTaskData()?.interaction?.outboundType === 'OUTDIAL';\n\nfunction getWxAppAgentParticipant(deps: WxAppVoiceDependencies): unknown {\n const taskData = deps.getTaskData();\n const participants = taskData.interaction?.participants;\n const agentId = deps.agentId ?? taskData.agentId;\n\n if (!participants || !agentId) {\n return undefined;\n }\n\n if (participants[agentId]) {\n return participants[agentId];\n }\n\n return Object.values(participants).find(\n (participant) => (participant as {id?: string})?.id === agentId\n );\n}\n\nexport function getWxAppParticipantDiagnostics(\n deps: WxAppVoiceDependencies\n): WxAppParticipantDiagnostics {\n const participant = getWxAppAgentParticipant(deps) as WxAppParticipant | undefined;\n const hasDeviceCallId =\n typeof participant?.deviceCallId === 'string' && participant.deviceCallId.trim() !== '';\n const hasDeviceId =\n typeof participant?.deviceId === 'string' && participant.deviceId.trim() !== '';\n\n return {\n participantDeviceType: participant?.deviceType,\n hasDeviceCallId,\n hasDeviceId,\n hasValidWxAppParticipant: isWxAppParticipant(participant),\n };\n}\n\nfunction getWxAppTelephonyMetricContext(\n deps: WxAppVoiceDependencies\n): Record<string, boolean | string> {\n const diagnostics = getWxAppParticipantDiagnostics(deps);\n\n return {\n hasDeviceCallId: diagnostics.hasDeviceCallId,\n hasDeviceId: diagnostics.hasDeviceId,\n };\n}\n\nexport function getCallingDeviceDetails(\n deps: WxAppVoiceDependencies\n): WebexCallingDeviceDetails | undefined {\n const taskData = deps.getTaskData();\n const participant = getWxAppAgentParticipant(deps);\n\n if (!isWxAppParticipant(participant)) {\n return undefined;\n }\n\n return getWebexCallingDeviceDetailsForAgent(\n deps.agentId ?? taskData.agentId,\n taskData.interaction?.participants\n );\n}\n\nexport function isWebexAppCallingOffer(deps: WxAppVoiceDependencies): boolean {\n if (!deps.enableWxBetterTogether) {\n return false;\n }\n\n const state = deps.getTaskState();\n if (state !== TaskState.OFFERED) {\n return false;\n }\n\n const details = getCallingDeviceDetails(deps);\n\n return Boolean(details);\n}\n\n/** Inbound wxApp offer only — outdial decline uses CC routing, not telephony reject. */\nexport function isWebexAppInboundCallingOffer(deps: WxAppVoiceDependencies): boolean {\n return isWebexAppCallingOffer(deps) && !isOutdialTask(deps);\n}\n\nexport function getWebexCallingCallId(deps: WxAppVoiceDependencies): string | null {\n const state = deps.getTaskState();\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 null;\n }\n\n return getCallingDeviceDetails(deps)?.deviceCallId ?? null;\n}\n\nexport function getWxAppLineOwnerId(deps: WxAppVoiceDependencies): string | undefined {\n const participant = getWxAppAgentParticipant(deps) as {lineOwnerId?: string} | undefined;\n const lineOwnerId = participant?.lineOwnerId;\n\n return typeof lineOwnerId === 'string' && lineOwnerId.trim() !== '' ? lineOwnerId : undefined;\n}\n\nexport function resolveWxAppLineOwnerId(\n deps: WxAppVoiceDependencies,\n override?: string\n): string | undefined {\n if (typeof override === 'string' && override.trim() !== '') {\n return override;\n }\n\n return decodedLineOwnerId(getWxAppLineOwnerId(deps));\n}\n\nfunction getInteractionId(deps: WxAppVoiceDependencies): string | undefined {\n return deps.getTaskData()?.interactionId;\n}\n\nfunction logTelephonyFailure(\n action: WxAppTelephonyAction,\n deps: WxAppVoiceDependencies,\n error: unknown\n): void {\n const wxError = error as WxAppTelephonyError;\n logWxAppTelephonyAction({\n action,\n phase: 'failed',\n interactionId: getInteractionId(deps),\n trackingId: wxError.trackingId,\n httpStatus: wxError.status,\n failureReason: wxError.message,\n });\n}\n\nfunction getWxAppTelephonyMetricFailurePayload(\n deps: WxAppVoiceDependencies,\n error: unknown\n): Record<string, string | boolean> {\n const wxError = error as WxAppTelephonyError;\n const payload: Record<string, string | boolean> = {\n taskId: getInteractionId(deps) ?? '',\n error: error instanceof Error ? error.toString() : String(error),\n ...getWxAppTelephonyMetricContext(deps),\n };\n\n if (wxError.trackingId) {\n payload.trackingId = wxError.trackingId;\n }\n\n return payload;\n}\n\ntype AqmWrappedError = {\n details?: Failure;\n};\n\nfunction getWxAppOutdialDeclineFailurePayload(\n deps: WxAppVoiceDependencies,\n error: unknown\n): EventPayload {\n const base: EventPayload = {\n taskId: getInteractionId(deps) ?? '',\n error: error instanceof Error ? error.toString() : String(error),\n };\n const aqmDetails = (error as AqmWrappedError).details;\n\n if (aqmDetails) {\n return {\n ...base,\n ...getWxAppTelephonyMetricContext(deps),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(aqmDetails),\n };\n }\n\n return getWxAppTelephonyMetricFailurePayload(deps, error);\n}\n\nfunction logWxAppOutdialDeclineFailure(deps: WxAppVoiceDependencies, error: unknown): void {\n const aqmDetails = (error as AqmWrappedError).details;\n const wxError = error as WxAppTelephonyError;\n\n logWxAppTelephonyAction({\n action: 'decline',\n phase: 'failed',\n interactionId: getInteractionId(deps),\n trackingId: aqmDetails?.trackingId ?? wxError.trackingId,\n httpStatus: wxError.status,\n failureReason: aqmDetails?.data?.reason ?? wxError.message,\n });\n}\n\nfunction assertWxAppEnabled(deps: WxAppVoiceDependencies): void {\n if (!deps.enableWxBetterTogether) {\n logWxAppValidationFailure('enableWxBetterTogether_disabled', getInteractionId(deps));\n throw new Error('enableWxBetterTogether is disabled');\n }\n\n if (!deps.answerCallOnWebexService) {\n logWxAppValidationFailure('answer_call_on_webex_service_unavailable', getInteractionId(deps));\n throw new Error('AnswerCallOnWebexService is unavailable');\n }\n}\n\nexport async function acceptOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'accept', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n if (!isWebexAppCallingOffer(deps)) {\n logWxAppValidationFailure('not_wxApp_calling_offer', interactionId);\n throw new Error('Task is not a wxApp calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n logWxAppValidationFailure('wxApp_device_details_unavailable', interactionId);\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.answerCall({\n callId: details.deviceCallId,\n endpointId: details.deviceId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'accept', phase: 'success', interactionId});\n}\n\nexport async function rejectOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'decline', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n if (!isWebexAppInboundCallingOffer(deps)) {\n logWxAppValidationFailure('not_wxApp_inbound_calling_offer', interactionId);\n throw new Error('Task is not a wxApp inbound calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n logWxAppValidationFailure('wxApp_device_details_unavailable', interactionId);\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.rejectCall({\n callId: details.deviceCallId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'decline', phase: 'success', interactionId});\n}\n\nexport async function toggleMuteOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string; muted?: boolean}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'mute', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n logWxAppValidationFailure('wxApp_call_id_unavailable', interactionId);\n throw new Error('WxApp call ID is unavailable');\n }\n\n const targetMuted = options?.muted ?? !deps.getWxAppMuted();\n const request = targetMuted\n ? deps.answerCallOnWebexService.muteCall.bind(deps.answerCallOnWebexService)\n : deps.answerCallOnWebexService.unmuteCall.bind(deps.answerCallOnWebexService);\n\n await request({\n callId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n deps.setWxAppMuted(targetMuted);\n logWxAppTelephonyAction({action: 'mute', phase: 'success', interactionId});\n}\n\nexport async function transmitDtmfOnWebex(\n deps: WxAppVoiceDependencies,\n options: {dtmf: string; lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'dtmf', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n logWxAppValidationFailure('wxApp_call_id_unavailable', interactionId);\n throw new Error('WxApp call ID is unavailable');\n }\n\n LoggerProxy.log('transmitDtmf', {\n module: 'wxAppVoiceMethods',\n method: METHODS.TRANSMIT_DTMF,\n data: {\n interactionId,\n callIdSuffix: callId.length <= 8 ? callId : callId.slice(-8),\n dtmfLength: options.dtmf.length,\n hasLineOwnerId: Boolean(options.lineOwnerId),\n },\n });\n\n await deps.answerCallOnWebexService.transmitDtmf({\n callId,\n dtmf: options.dtmf,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'dtmf', phase: 'success', interactionId});\n}\n\nexport type WxAppAcceptRejectOptions = {\n lineOwnerId?: string;\n acceptReason?: WxAppAcceptReason;\n};\n\nexport async function runWxAppAccept(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: WxAppAcceptRejectOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED,\n ]);\n\n try {\n lifecycle.setWxAppAcceptInFlight(true);\n lifecycle.setWxAppAnswerPending(true);\n await acceptOnWebex(deps, options);\n lifecycle.resetWxAppMuted();\n await lifecycle.syncWxAppMuteFromCallDetails();\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS,\n {taskId, acceptReason, ...getWxAppTelephonyMetricContext(deps)},\n ['operational', 'behavioral']\n );\n } catch (error) {\n lifecycle.setWxAppAnswerPending(false);\n logTelephonyFailure('accept', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED,\n {acceptReason, ...getWxAppTelephonyMetricFailurePayload(deps, error)},\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.ACCEPT);\n } finally {\n lifecycle.setWxAppAcceptInFlight(false);\n }\n}\n\nexport async function runWxAppReject(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: WxAppAcceptRejectOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n ]);\n\n try {\n await rejectOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n {taskId, acceptReason, ...getWxAppTelephonyMetricContext(deps)},\n ['operational', 'behavioral']\n );\n } catch (error) {\n logTelephonyFailure('decline', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n {acceptReason, ...getWxAppTelephonyMetricFailurePayload(deps, error)},\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.REJECT);\n }\n}\n\nexport type WxAppOutdialDeclineOptions = {\n acceptReason?: WxAppAcceptReason;\n};\n\nexport async function runWxAppOutdialDecline<T>(\n deps: WxAppVoiceDependencies,\n executeCancel: () => Promise<T>,\n options?: WxAppOutdialDeclineOptions\n): Promise<T> {\n const taskId = getInteractionId(deps);\n const acceptReason = options?.acceptReason ?? 'wxApp_offer_ready';\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n ]);\n\n try {\n const result = await executeCancel();\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n {taskId, acceptReason, ...getWxAppTelephonyMetricContext(deps)},\n ['operational', 'behavioral']\n );\n\n return result;\n } catch (error) {\n logWxAppOutdialDeclineFailure(deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n {acceptReason, ...getWxAppOutdialDeclineFailurePayload(deps, error)},\n ['operational', 'behavioral']\n );\n throw error;\n }\n}\n\nexport async function runWxAppToggleMute(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: TaskToggleMuteOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED,\n ]);\n\n try {\n await toggleMuteOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS,\n {taskId, targetMuted: deps.getWxAppMuted(), ...getWxAppTelephonyMetricContext(deps)},\n ['operational', 'behavioral']\n );\n } catch (error) {\n logTelephonyFailure('mute', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.TOGGLE_MUTE);\n }\n}\n\nexport async function runWxAppTransmitDtmf(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options: TaskTransmitDtmfOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED,\n ]);\n\n try {\n await transmitDtmfOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS,\n {taskId, dtmfLength: options.dtmf.length, ...getWxAppTelephonyMetricContext(deps)},\n ['operational', 'behavioral']\n );\n } catch (error) {\n logTelephonyFailure('dtmf', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.TRANSMIT_DTMF);\n }\n}\n\nexport function mapWxAppVoiceError(error: unknown, method: string, module: string): never {\n if (\n error instanceof Error &&\n (error as Error & {isWxAppTelephonyError?: boolean}).isWxAppTelephonyError\n ) {\n throw error;\n }\n\n const {error: detailedError} = getErrorDetails(error, method, module);\n throw detailedError;\n}\n"],"mappings":"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","ignoreList":[]}