@webex/contact-center 3.12.0-next.16 → 3.12.0-next.160

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 (328) 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 +385 -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 +888 -49
  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 +38 -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 +185 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +54 -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 +369 -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/WebCallingService.js +10 -2
  68. package/dist/services/WebCallingService.js.map +1 -1
  69. package/dist/services/WebexCrossClientService.js +225 -0
  70. package/dist/services/WebexCrossClientService.js.map +1 -0
  71. package/dist/services/WxAppTelephonyMercurySync.js +111 -0
  72. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  73. package/dist/services/config/Util.js +48 -48
  74. package/dist/services/config/Util.js.map +1 -1
  75. package/dist/services/config/constants.js +56 -78
  76. package/dist/services/config/constants.js.map +1 -1
  77. package/dist/services/config/index.js +100 -226
  78. package/dist/services/config/index.js.map +1 -1
  79. package/dist/services/config/types.js +93 -24
  80. package/dist/services/config/types.js.map +1 -1
  81. package/dist/services/constants.js +11 -1
  82. package/dist/services/constants.js.map +1 -1
  83. package/dist/services/core/Err.js.map +1 -1
  84. package/dist/services/core/Utils.js +131 -32
  85. package/dist/services/core/Utils.js.map +1 -1
  86. package/dist/services/core/WebexRequest.js +6 -2
  87. package/dist/services/core/WebexRequest.js.map +1 -1
  88. package/dist/services/core/aqm-reqs.js +17 -11
  89. package/dist/services/core/aqm-reqs.js.map +1 -1
  90. package/dist/services/core/constants.js +9 -1
  91. package/dist/services/core/constants.js.map +1 -1
  92. package/dist/services/core/types.js.map +1 -1
  93. package/dist/services/core/websocket/WebSocketManager.js +19 -2
  94. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  95. package/dist/services/core/websocket/types.js.map +1 -1
  96. package/dist/services/index.js +1 -1
  97. package/dist/services/index.js.map +1 -1
  98. package/dist/services/task/Task.js +955 -0
  99. package/dist/services/task/Task.js.map +1 -0
  100. package/dist/services/task/TaskFactory.js +50 -0
  101. package/dist/services/task/TaskFactory.js.map +1 -0
  102. package/dist/services/task/TaskManager.js +1272 -605
  103. package/dist/services/task/TaskManager.js.map +1 -1
  104. package/dist/services/task/TaskUtils.js +221 -27
  105. package/dist/services/task/TaskUtils.js.map +1 -1
  106. package/dist/services/task/WebexCallingUtils.js +70 -0
  107. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  108. package/dist/services/task/constants.js +19 -2
  109. package/dist/services/task/constants.js.map +1 -1
  110. package/dist/services/task/contact.js +29 -0
  111. package/dist/services/task/contact.js.map +1 -1
  112. package/dist/services/task/digital/Digital.js +78 -0
  113. package/dist/services/task/digital/Digital.js.map +1 -0
  114. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  115. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  116. package/dist/services/task/state-machine/actions.js +572 -0
  117. package/dist/services/task/state-machine/actions.js.map +1 -0
  118. package/dist/services/task/state-machine/constants.js +161 -0
  119. package/dist/services/task/state-machine/constants.js.map +1 -0
  120. package/dist/services/task/state-machine/guards.js +379 -0
  121. package/dist/services/task/state-machine/guards.js.map +1 -0
  122. package/dist/services/task/state-machine/index.js +53 -0
  123. package/dist/services/task/state-machine/index.js.map +1 -0
  124. package/dist/services/task/state-machine/types.js +54 -0
  125. package/dist/services/task/state-machine/types.js.map +1 -0
  126. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  127. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  128. package/dist/services/task/taskDataNormalizer.js +99 -0
  129. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  130. package/dist/services/task/types.js +215 -5
  131. package/dist/services/task/types.js.map +1 -1
  132. package/dist/services/task/voice/Voice.js +1504 -0
  133. package/dist/services/task/voice/Voice.js.map +1 -0
  134. package/dist/services/task/voice/WebRTC.js +152 -0
  135. package/dist/services/task/voice/WebRTC.js.map +1 -0
  136. package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
  137. package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
  138. package/dist/services/task/voice/wxAppVoiceMethods.js +395 -0
  139. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  140. package/dist/services/wxAppDiagnosticLogging.js +159 -0
  141. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  142. package/dist/services/wxAppTelephonyUtils.js +19 -0
  143. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  144. package/dist/types/cc.d.ts +152 -9
  145. package/dist/types/config.d.ts +13 -0
  146. package/dist/types/constants.d.ts +36 -1
  147. package/dist/types/index.d.ts +54 -20
  148. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  149. package/dist/types/metrics/constants.d.ts +48 -1
  150. package/dist/types/services/AddressBook.d.ts +2 -1
  151. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  152. package/dist/types/services/ApiAiAssistant.d.ts +67 -5
  153. package/dist/types/services/EntryPoint.d.ts +7 -5
  154. package/dist/types/services/Queue.d.ts +5 -3
  155. package/dist/types/services/UserPreference.d.ts +118 -0
  156. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  157. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  158. package/dist/types/services/config/Util.d.ts +4 -8
  159. package/dist/types/services/config/constants.d.ts +49 -76
  160. package/dist/types/services/config/index.d.ts +16 -64
  161. package/dist/types/services/config/types.d.ts +240 -114
  162. package/dist/types/services/constants.d.ts +9 -0
  163. package/dist/types/services/core/Err.d.ts +2 -0
  164. package/dist/types/services/core/Utils.d.ts +43 -13
  165. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  166. package/dist/types/services/core/constants.d.ts +7 -0
  167. package/dist/types/services/core/types.d.ts +2 -0
  168. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  169. package/dist/types/services/core/websocket/types.d.ts +1 -1
  170. package/dist/types/services/index.d.ts +1 -1
  171. package/dist/types/services/task/Task.d.ts +186 -0
  172. package/dist/types/services/task/TaskFactory.d.ts +14 -0
  173. package/dist/types/services/task/TaskUtils.d.ts +54 -2
  174. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  175. package/dist/types/services/task/constants.d.ts +17 -0
  176. package/dist/types/services/task/contact.d.ts +4 -0
  177. package/dist/types/services/task/digital/Digital.d.ts +23 -0
  178. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  179. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  180. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  181. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  182. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  183. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  184. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  185. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  186. package/dist/types/services/task/types.d.ts +738 -66
  187. package/dist/types/services/task/voice/Voice.d.ts +241 -0
  188. package/dist/types/services/task/voice/WebRTC.d.ts +54 -0
  189. package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
  190. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +68 -0
  191. package/dist/types/services/wxAppDiagnosticLogging.d.ts +63 -0
  192. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  193. package/dist/types/types.d.ts +213 -11
  194. package/dist/types/utils/PageCache.d.ts +20 -3
  195. package/dist/types/webex.d.ts +1 -0
  196. package/dist/types.js +168 -6
  197. package/dist/types.js.map +1 -1
  198. package/dist/utils/PageCache.js +19 -5
  199. package/dist/utils/PageCache.js.map +1 -1
  200. package/dist/webex.js +22 -2
  201. package/dist/webex.js.map +1 -1
  202. package/package.json +16 -12
  203. package/src/cc.ts +1137 -67
  204. package/src/config.ts +13 -0
  205. package/src/constants.ts +39 -1
  206. package/src/index.ts +62 -15
  207. package/src/metrics/MetricsManager.ts +16 -0
  208. package/src/metrics/ai-docs/AGENTS.md +350 -0
  209. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  210. package/src/metrics/ai-docs/metrics-spec.md +971 -0
  211. package/src/metrics/behavioral-events.ts +190 -0
  212. package/src/metrics/constants.ts +59 -4
  213. package/src/services/AddressBook.ts +17 -6
  214. package/src/services/AnswerCallOnWebexService.ts +239 -0
  215. package/src/services/ApiAiAssistant.ts +494 -15
  216. package/src/services/EntryPoint.ts +59 -60
  217. package/src/services/Queue.ts +29 -12
  218. package/src/services/UserPreference.ts +509 -0
  219. package/src/services/WebCallingService.ts +16 -2
  220. package/src/services/WebexCrossClientService.ts +298 -0
  221. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  222. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  223. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  224. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  225. package/src/services/ai-docs/AGENTS.md +386 -0
  226. package/src/services/ai-docs/services-spec.md +512 -0
  227. package/src/services/config/Util.ts +54 -84
  228. package/src/services/config/ai-docs/AGENTS.md +250 -0
  229. package/src/services/config/ai-docs/ARCHITECTURE.md +413 -0
  230. package/src/services/config/ai-docs/config-spec.md +669 -0
  231. package/src/services/config/constants.ts +63 -85
  232. package/src/services/config/index.ts +116 -277
  233. package/src/services/config/types.ts +229 -125
  234. package/src/services/constants.ts +10 -0
  235. package/src/services/core/Err.ts +1 -0
  236. package/src/services/core/Utils.ts +151 -37
  237. package/src/services/core/WebexRequest.ts +3 -1
  238. package/src/services/core/ai-docs/AGENTS.md +381 -0
  239. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  240. package/src/services/core/ai-docs/core-spec.md +797 -0
  241. package/src/services/core/aqm-reqs.ts +18 -12
  242. package/src/services/core/constants.ts +8 -0
  243. package/src/services/core/types.ts +33 -1
  244. package/src/services/core/websocket/WebSocketManager.ts +28 -2
  245. package/src/services/core/websocket/types.ts +1 -1
  246. package/src/services/index.ts +1 -1
  247. package/src/services/task/Task.ts +1211 -0
  248. package/src/services/task/TaskFactory.ts +82 -0
  249. package/src/services/task/TaskManager.ts +1585 -724
  250. package/src/services/task/TaskUtils.ts +316 -25
  251. package/src/services/task/WebexCallingUtils.ts +136 -0
  252. package/src/services/task/ai-docs/AGENTS.md +457 -0
  253. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  254. package/src/services/task/ai-docs/task-spec.md +1501 -0
  255. package/src/services/task/constants.ts +18 -0
  256. package/src/services/task/contact.ts +30 -0
  257. package/src/services/task/digital/Digital.ts +102 -0
  258. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  259. package/src/services/task/state-machine/actions.ts +741 -0
  260. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  261. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  262. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  263. package/src/services/task/state-machine/constants.ts +172 -0
  264. package/src/services/task/state-machine/guards.ts +442 -0
  265. package/src/services/task/state-machine/index.ts +28 -0
  266. package/src/services/task/state-machine/types.ts +258 -0
  267. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  268. package/src/services/task/taskDataNormalizer.ts +137 -0
  269. package/src/services/task/types.ts +918 -70
  270. package/src/services/task/voice/Voice.ts +1878 -0
  271. package/src/services/task/voice/WebRTC.ts +194 -0
  272. package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
  273. package/src/services/task/voice/wxAppVoiceMethods.ts +575 -0
  274. package/src/services/wxAppDiagnosticLogging.ts +286 -0
  275. package/src/services/wxAppTelephonyUtils.ts +14 -0
  276. package/src/types.ts +272 -13
  277. package/src/utils/AGENTS.md +289 -0
  278. package/src/utils/PageCache.ts +38 -5
  279. package/src/utils/ai-docs/utils-spec.md +391 -0
  280. package/src/webex.js +10 -0
  281. package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
  282. package/test/unit/spec/cc.ts +3553 -107
  283. package/test/unit/spec/index.ts +885 -0
  284. package/test/unit/spec/logger-proxy.ts +70 -0
  285. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  286. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  287. package/test/unit/spec/services/AddressBook.ts +37 -6
  288. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  289. package/test/unit/spec/services/ApiAiAssistant.ts +442 -23
  290. package/test/unit/spec/services/EntryPoint.ts +87 -40
  291. package/test/unit/spec/services/Queue.ts +123 -12
  292. package/test/unit/spec/services/UserPreference.ts +401 -0
  293. package/test/unit/spec/services/WebCallingService.ts +45 -1
  294. package/test/unit/spec/services/WebexCrossClientService.ts +509 -0
  295. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  296. package/test/unit/spec/services/config/Util.ts +501 -0
  297. package/test/unit/spec/services/config/index.ts +317 -547
  298. package/test/unit/spec/services/core/Utils.ts +447 -8
  299. package/test/unit/spec/services/core/WebexRequest.ts +8 -7
  300. package/test/unit/spec/services/core/aqm-reqs.ts +142 -1
  301. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +129 -53
  302. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  303. package/test/unit/spec/services/task/Task.ts +2723 -0
  304. package/test/unit/spec/services/task/TaskFactory.ts +116 -0
  305. package/test/unit/spec/services/task/TaskManager.ts +4734 -1769
  306. package/test/unit/spec/services/task/TaskUtils.ts +307 -0
  307. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  308. package/test/unit/spec/services/task/contact.ts +33 -0
  309. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  310. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  311. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  312. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  313. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  314. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  315. package/test/unit/spec/services/task/voice/Voice.ts +2355 -0
  316. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  317. package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
  318. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +719 -0
  319. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +179 -0
  320. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  321. package/typedoc.md +1 -1
  322. package/umd/contact-center.min.js +2 -2
  323. package/umd/contact-center.min.js.map +1 -1
  324. package/dist/services/task/index.js +0 -1530
  325. package/dist/services/task/index.js.map +0 -1
  326. package/dist/types/services/task/index.d.ts +0 -650
  327. package/src/services/task/index.ts +0 -1806
  328. package/test/unit/spec/services/task/index.ts +0 -2205
@@ -313,6 +313,104 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
313
313
  target: 'task_outdial',
314
314
  verb: 'fail',
315
315
  },
316
+ [METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS]: {
317
+ product,
318
+ agent: 'user',
319
+ target: 'task_mute_webex_together',
320
+ verb: 'complete',
321
+ },
322
+ [METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED]: {
323
+ product,
324
+ agent: 'user',
325
+ target: 'task_mute_webex_together',
326
+ verb: 'fail',
327
+ },
328
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS]: {
329
+ product,
330
+ agent: 'user',
331
+ target: 'task_dtmf_webex_together',
332
+ verb: 'complete',
333
+ },
334
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED]: {
335
+ product,
336
+ agent: 'user',
337
+ target: 'task_dtmf_webex_together',
338
+ verb: 'fail',
339
+ },
340
+
341
+ // Webex Together (wxApp)
342
+ [METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS]: {
343
+ product,
344
+ agent: 'user',
345
+ target: 'task_accept_webex_together',
346
+ verb: 'complete',
347
+ },
348
+ [METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED]: {
349
+ product,
350
+ agent: 'user',
351
+ target: 'task_accept_webex_together',
352
+ verb: 'fail',
353
+ },
354
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS]: {
355
+ product,
356
+ agent: 'user',
357
+ target: 'task_reject_webex_together',
358
+ verb: 'complete',
359
+ },
360
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]: {
361
+ product,
362
+ agent: 'user',
363
+ target: 'task_reject_webex_together',
364
+ verb: 'fail',
365
+ },
366
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS]: {
367
+ product,
368
+ agent: 'user',
369
+ target: 'webex_together_session_init',
370
+ verb: 'complete',
371
+ },
372
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED]: {
373
+ product,
374
+ agent: 'user',
375
+ target: 'webex_together_session_init',
376
+ verb: 'fail',
377
+ },
378
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED]: {
379
+ product,
380
+ agent: 'user',
381
+ target: 'webex_together_session_init',
382
+ verb: 'ignore',
383
+ },
384
+ [METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS]: {
385
+ product,
386
+ agent: 'user',
387
+ target: 'webex_together_usersub_publish',
388
+ verb: 'complete',
389
+ },
390
+ [METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED]: {
391
+ product,
392
+ agent: 'user',
393
+ target: 'webex_together_usersub_publish',
394
+ verb: 'fail',
395
+ },
396
+ [METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_SUCCESS]: {
397
+ product,
398
+ agent: 'user',
399
+ target: 'webex_together_mercury_subscribe',
400
+ verb: 'complete',
401
+ },
402
+ [METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED]: {
403
+ product,
404
+ agent: 'user',
405
+ target: 'webex_together_mercury_subscribe',
406
+ verb: 'fail',
407
+ },
408
+ [METRIC_EVENT_NAMES.WXAPP_OFFER_PARTICIPANT_FIELDS_MISSING]: {
409
+ product,
410
+ agent: 'user',
411
+ target: 'webex_together_offer_participant_fields',
412
+ verb: 'fail',
413
+ },
316
414
 
317
415
  // Conference Tasks
318
416
  [METRIC_EVENT_NAMES.TASK_CONFERENCE_START_SUCCESS]: {
@@ -352,6 +450,48 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
352
450
  verb: 'fail',
353
451
  },
354
452
 
453
+ // Conference Exit
454
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_EXIT_SUCCESS]: {
455
+ product,
456
+ agent: 'user',
457
+ target: 'task_conference_exit',
458
+ verb: 'complete',
459
+ },
460
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_EXIT_FAILED]: {
461
+ product,
462
+ agent: 'user',
463
+ target: 'task_conference_exit',
464
+ verb: 'fail',
465
+ },
466
+
467
+ // Conference Participant Drop
468
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS]: {
469
+ product,
470
+ agent: 'user',
471
+ target: 'task_conference_participant_drop',
472
+ verb: 'complete',
473
+ },
474
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_PARTICIPANT_DROP_FAILED]: {
475
+ product,
476
+ agent: 'user',
477
+ target: 'task_conference_participant_drop',
478
+ verb: 'fail',
479
+ },
480
+
481
+ // Switch Call
482
+ [METRIC_EVENT_NAMES.TASK_SWITCH_CALL_SUCCESS]: {
483
+ product,
484
+ agent: 'user',
485
+ target: 'task_switch_call',
486
+ verb: 'complete',
487
+ },
488
+ [METRIC_EVENT_NAMES.TASK_SWITCH_CALL_FAILED]: {
489
+ product,
490
+ agent: 'user',
491
+ target: 'task_switch_call',
492
+ verb: 'fail',
493
+ },
494
+
355
495
  // upload logs
356
496
  [METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS]: {
357
497
  product,
@@ -477,6 +617,56 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
477
617
  target: 'campaign_preview_remove',
478
618
  verb: 'fail',
479
619
  },
620
+
621
+ // User Preference API Events
622
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS]: {
623
+ product,
624
+ agent: 'user',
625
+ target: 'user_preference_get',
626
+ verb: 'complete',
627
+ },
628
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED]: {
629
+ product,
630
+ agent: 'user',
631
+ target: 'user_preference_get',
632
+ verb: 'fail',
633
+ },
634
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS]: {
635
+ product,
636
+ agent: 'user',
637
+ target: 'user_preference_create',
638
+ verb: 'complete',
639
+ },
640
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED]: {
641
+ product,
642
+ agent: 'user',
643
+ target: 'user_preference_create',
644
+ verb: 'fail',
645
+ },
646
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS]: {
647
+ product,
648
+ agent: 'user',
649
+ target: 'user_preference_update',
650
+ verb: 'complete',
651
+ },
652
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED]: {
653
+ product,
654
+ agent: 'user',
655
+ target: 'user_preference_update',
656
+ verb: 'fail',
657
+ },
658
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS]: {
659
+ product,
660
+ agent: 'user',
661
+ target: 'user_preference_delete',
662
+ verb: 'complete',
663
+ },
664
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED]: {
665
+ product,
666
+ agent: 'user',
667
+ target: 'user_preference_delete',
668
+ verb: 'fail',
669
+ },
480
670
  };
481
671
 
482
672
  /**
@@ -129,20 +129,44 @@ export const METRIC_EVENT_NAMES = {
129
129
  TASK_CONFERENCE_END_FAILED: 'Task Conference End Failed',
130
130
  TASK_CONFERENCE_TRANSFER_SUCCESS: 'Task Conference Transfer Success',
131
131
  TASK_CONFERENCE_TRANSFER_FAILED: 'Task Conference Transfer Failed',
132
+ TASK_CONFERENCE_EXIT_SUCCESS: 'Task Conference Exit Success',
133
+ TASK_CONFERENCE_EXIT_FAILED: 'Task Conference Exit Failed',
134
+ TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS: 'Task Conference Participant Drop Success',
135
+ TASK_CONFERENCE_PARTICIPANT_DROP_FAILED: 'Task Conference Participant Drop Failed',
136
+ TASK_SWITCH_CALL_SUCCESS: 'Task Switch Call Success',
137
+ TASK_SWITCH_CALL_FAILED: 'Task Switch Call Failed',
132
138
 
133
139
  TASK_OUTDIAL_SUCCESS: 'Task Outdial Success',
134
140
  TASK_OUTDIAL_FAILED: 'Task Outdial Failed',
135
141
 
142
+ WXAPP_TASK_MUTE_SUCCESS: 'WxApp Task Mute Success',
143
+ WXAPP_TASK_MUTE_FAILED: 'WxApp Task Mute Failed',
144
+ WXAPP_TASK_DTMF_SUCCESS: 'WxApp Task Dtmf Success',
145
+ WXAPP_TASK_DTMF_FAILED: 'WxApp Task Dtmf Failed',
146
+
147
+ // WxApp Better Together
148
+ WXAPP_TASK_ACCEPT_SUCCESS: 'WxApp Task Accept Success',
149
+ WXAPP_TASK_ACCEPT_FAILED: 'WxApp Task Accept Failed',
150
+ WXAPP_TASK_DECLINE_SUCCESS: 'WxApp Task Decline Success',
151
+ WXAPP_TASK_DECLINE_FAILED: 'WxApp Task Decline Failed',
152
+ WXAPP_SESSION_INIT_SUCCESS: 'WxApp Session Init Success',
153
+ WXAPP_SESSION_INIT_FAILED: 'WxApp Session Init Failed',
154
+ WXAPP_SESSION_SKIPPED: 'WxApp Session Skipped',
155
+ WXAPP_USERSUB_PUBLISH_SUCCESS: 'WxApp Usersub Publish Success',
156
+ WXAPP_USERSUB_PUBLISH_FAILED: 'WxApp Usersub Publish Failed',
157
+ WXAPP_MERCURY_SUBSCRIBE_SUCCESS: 'WxApp Mercury Subscribe Success',
158
+ WXAPP_MERCURY_SUBSCRIBE_FAILED: 'WxApp Mercury Subscribe Failed',
159
+ WXAPP_OFFER_PARTICIPANT_FIELDS_MISSING: 'WxApp Offer Participant Fields Missing',
160
+
136
161
  UPLOAD_LOGS_SUCCESS: 'Upload Logs Success',
137
162
  UPLOAD_LOGS_FAILED: 'Upload Logs Failed',
138
163
  WEBSOCKET_DEREGISTER_SUCCESS: 'Websocket Deregister Success',
139
164
  WEBSOCKET_DEREGISTER_FAIL: 'Websocket Deregister Failed',
140
165
 
141
- // WebSocket message events
142
- WEBSOCKET_EVENT_RECEIVED: 'Websocket Event Received',
143
-
144
166
  AGENT_DEVICE_TYPE_UPDATE_SUCCESS: 'Agent Device Type Update Success',
145
167
  AGENT_DEVICE_TYPE_UPDATE_FAILED: 'Agent Device Type Update Failed',
168
+ // WebSocket message events
169
+ WEBSOCKET_EVENT_RECEIVED: 'Websocket Event Received',
146
170
 
147
171
  // EntryPoint API Events
148
172
  ENTRYPOINT_FETCH_SUCCESS: 'Entrypoint Fetch Success',
@@ -168,12 +192,43 @@ export const METRIC_EVENT_NAMES = {
168
192
  CAMPAIGN_PREVIEW_REMOVE_SUCCESS: 'Campaign Preview Remove Success',
169
193
  CAMPAIGN_PREVIEW_REMOVE_FAILED: 'Campaign Preview Remove Failed',
170
194
 
171
- // AI Assistant transcript events
195
+ // AI Assistant Transcript events
172
196
  AI_ASSISTANT_SEND_EVENT_SUCCESS: 'AI Assistant Send Event Success',
173
197
  AI_ASSISTANT_SEND_EVENT_FAILED: 'AI Assistant Send Event Failed',
198
+ AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS: 'AI Assistant Get Real Time Assistance Success',
199
+ AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED: 'AI Assistant Get Real Time Assistance Failed',
200
+ AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS:
201
+ 'AI Assistant Send Real Time Assistance User Action Success',
202
+ AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED:
203
+ 'AI Assistant Send Real Time Assistance User Action Failed',
174
204
  AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS:
175
205
  'AI Assistant Fetch Historic Transcripts Success',
176
206
  AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED: 'AI Assistant Fetch Historic Transcripts Failed',
207
+ AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED: 'AI Assistant Wellness Action Accepted',
208
+ AI_ASSISTANT_WELLNESS_ACTION_FAILED: 'AI Assistant Wellness Action Failed',
209
+ AI_ASSISTANT_WELLNESS_EVENT_INVALID: 'AI Assistant Wellness Event Invalid',
210
+ WELLBEING_BREAK_IDLE_CODE_FETCH_SUCCESS: 'Wellbeing Break Idle Code Fetch Success',
211
+ WELLBEING_BREAK_IDLE_CODE_FETCH_FAILED: 'Wellbeing Break Idle Code Fetch Failed',
212
+
213
+ // AI summary events
214
+ AI_SUMMARY_GET_POST_CALL_SUCCESS: 'Post Call Summary Get Success',
215
+ AI_SUMMARY_GET_POST_CALL_FAILED: 'Post Call Summary Get Failed',
216
+ AI_SUMMARY_GET_MID_CALL_SUCCESS: 'Mid Call Summary Get Success',
217
+ AI_SUMMARY_GET_MID_CALL_FAILED: 'Mid Call Summary Get Failed',
218
+ AI_SUMMARY_POST_CALL_RESPONSE_SUCCESS: 'Post Call Summary Response Success',
219
+ AI_SUMMARY_POST_CALL_RESPONSE_FAILED: 'Post Call Summary Response Failed',
220
+ AI_SUMMARY_MID_CALL_RESPONSE_SUCCESS: 'Mid Call Summary Response Success',
221
+ AI_SUMMARY_MID_CALL_RESPONSE_FAILED: 'Mid Call Summary Response Failed',
222
+
223
+ // User Preference API Events
224
+ USER_PREFERENCE_GET_SUCCESS: 'User Preference Get Success',
225
+ USER_PREFERENCE_GET_FAILED: 'User Preference Get Failed',
226
+ USER_PREFERENCE_CREATE_SUCCESS: 'User Preference Create Success',
227
+ USER_PREFERENCE_CREATE_FAILED: 'User Preference Create Failed',
228
+ USER_PREFERENCE_UPDATE_SUCCESS: 'User Preference Update Success',
229
+ USER_PREFERENCE_UPDATE_FAILED: 'User Preference Update Failed',
230
+ USER_PREFERENCE_DELETE_SUCCESS: 'User Preference Delete Success',
231
+ USER_PREFERENCE_DELETE_FAILED: 'User Preference Delete Failed',
177
232
  } as const;
178
233
 
179
234
  /**
@@ -74,7 +74,8 @@ export class AddressBook {
74
74
 
75
75
  /**
76
76
  * Fetches address book entries for a specific address book using the entry API
77
- * @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId
77
+ * @param {AddressBookEntrySearchParams} [params] - Search, pagination, and optional sort parameters
78
+ * including addressBookId. Sorting defaults to name ascending.
78
79
  * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries
79
80
  * @throws {Error} If the API call fails
80
81
  * @public
@@ -102,12 +103,21 @@ export class AddressBook {
102
103
  search,
103
104
  filter,
104
105
  attributes,
106
+ sortBy = 'name',
107
+ sortOrder = 'asc',
105
108
  } = params;
106
109
 
107
110
  // Use provided addressBookId or fall back to agent's address book
108
111
  const bookId = addressBookId || this.getAddressBookId();
109
112
  const orgId = this.webex.credentials.getOrgId();
110
- const isSearchRequest = !!(search || filter || attributes);
113
+ const hasCustomSort = sortBy !== 'name' || sortOrder !== 'asc';
114
+ const isSearchRequest = !!(search || filter || attributes || hasCustomSort);
115
+ const canUseCache = this.pageCache.canUseCache({
116
+ search,
117
+ filter,
118
+ attributes,
119
+ sortBy: hasCustomSort ? sortBy : undefined,
120
+ });
111
121
 
112
122
  LoggerProxy.info('Fetching address book entries', {
113
123
  module: 'AddressBook',
@@ -121,8 +131,8 @@ export class AddressBook {
121
131
  },
122
132
  });
123
133
 
124
- // Check if we can use cache for simple pagination (no search/filter/attributes)
125
- if (this.pageCache.canUseCache({search, filter, attributes})) {
134
+ // Default name-ascending pagination is cache-compatible; result-changing overrides are not.
135
+ if (canUseCache) {
126
136
  const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
127
137
  const cachedPage = this.pageCache.getCachedPage(cacheKey);
128
138
 
@@ -190,6 +200,7 @@ export class AddressBook {
190
200
  if (filter) queryParams.append('filter', filter);
191
201
  if (attributes) queryParams.append('attributes', attributes);
192
202
  if (search) queryParams.append('search', search);
203
+ if (sortBy) queryParams.append('sort', `${sortBy},${sortOrder.toUpperCase()}`);
193
204
 
194
205
  const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());
195
206
 
@@ -244,8 +255,8 @@ export class AddressBook {
244
255
  );
245
256
  }
246
257
 
247
- // Cache the page data for simple pagination (no search/filter/attributes)
248
- if (this.pageCache.canUseCache({search, filter, attributes}) && response.body?.data) {
258
+ // Cache only the invariant default-order pagination shape.
259
+ if (canUseCache && response.body?.data) {
249
260
  const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
250
261
  this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);
251
262
 
@@ -0,0 +1,239 @@
1
+ import LoggerProxy from '../logger-proxy';
2
+ import {CC_FILE, METHODS} from '../constants';
3
+ import {HTTP_METHODS, IHttpResponse, WebexSDK} from '../types';
4
+ import {getErrorDetails} from './core/Utils';
5
+ import {isWxAppCallNotFoundError} from './wxAppTelephonyUtils';
6
+
7
+ const ANSWER_CALL_ON_WEBEX_FILE = 'AnswerCallOnWebexService';
8
+
9
+ export type WxAppTelephonyError = Error & {
10
+ isWxAppTelephonyError: true;
11
+ trackingId?: string;
12
+ status?: number | string;
13
+ };
14
+
15
+ const extractWxAppTrackingId = (source: unknown): string | undefined => {
16
+ const sourceObj = source as {details?: {trackingId?: string}; trackingId?: string};
17
+
18
+ return sourceObj?.details?.trackingId || sourceObj?.trackingId;
19
+ };
20
+
21
+ const extractWxAppHttpStatus = (source: unknown): number | string | undefined => {
22
+ const obj = source as {
23
+ statusCode?: number;
24
+ status?: number | string;
25
+ details?: {status?: number | string};
26
+ };
27
+
28
+ return obj?.statusCode ?? obj?.status ?? obj?.details?.status;
29
+ };
30
+
31
+ const markWxAppTelephonyError = (error: Error, source: unknown): WxAppTelephonyError => {
32
+ const marked = error as WxAppTelephonyError;
33
+ marked.isWxAppTelephonyError = true;
34
+ const trackingId = extractWxAppTrackingId(source);
35
+ if (trackingId) {
36
+ marked.trackingId = trackingId;
37
+ }
38
+ const status = extractWxAppHttpStatus(source);
39
+ if (status !== undefined) {
40
+ marked.status = status;
41
+ }
42
+
43
+ return marked;
44
+ };
45
+
46
+ export type AnswerCallParams = {
47
+ callId: string;
48
+ endpointId: string;
49
+ lineOwnerId?: string;
50
+ };
51
+
52
+ export type CallIdParams = {
53
+ callId: string;
54
+ lineOwnerId?: string;
55
+ };
56
+
57
+ export type TransmitDtmfParams = CallIdParams & {
58
+ dtmf: string;
59
+ };
60
+
61
+ export type CallDetailsResponse = {
62
+ muted?: boolean;
63
+ };
64
+
65
+ /**
66
+ * REST telephony client for wxApp thick-client answer (WXCC-6026).
67
+ * Separate from WebCallingService (WebRTC/Mobius).
68
+ */
69
+ export default class AnswerCallOnWebexService {
70
+ private webex: WebexSDK;
71
+
72
+ constructor(webex: WebexSDK) {
73
+ this.webex = webex;
74
+ }
75
+
76
+ private getTelephonyBaseUrl(): string {
77
+ const services = this.webex.internal.services;
78
+ const hydraUrl = services._serviceUrls?.hydra || services.get('hydra');
79
+
80
+ if (!hydraUrl) {
81
+ throw new Error('Telephony base URL is unavailable');
82
+ }
83
+
84
+ return `${hydraUrl.replace(/\/$/, '')}/telephony/calls`;
85
+ }
86
+
87
+ private extractTrackingId(source: unknown): string | undefined {
88
+ return extractWxAppTrackingId(source);
89
+ }
90
+
91
+ private async telephonyRequest(
92
+ resource: string,
93
+ method: HTTP_METHODS,
94
+ body: Record<string, unknown>,
95
+ logMethod: string
96
+ ): Promise<IHttpResponse> {
97
+ try {
98
+ const uri = `${this.getTelephonyBaseUrl()}${resource}`;
99
+
100
+ LoggerProxy.log(`AnswerCallOnWebexService.${logMethod} request`, {
101
+ module: ANSWER_CALL_ON_WEBEX_FILE,
102
+ method: logMethod,
103
+ data: {uri, bodyKeys: Object.keys(body)},
104
+ });
105
+
106
+ const response = (await this.webex.request({
107
+ uri,
108
+ method,
109
+ body,
110
+ addAuthHeader: true,
111
+ })) as IHttpResponse;
112
+
113
+ LoggerProxy.log(`AnswerCallOnWebexService.${logMethod} success`, {
114
+ module: ANSWER_CALL_ON_WEBEX_FILE,
115
+ method: logMethod,
116
+ data: {statusCode: response.statusCode},
117
+ });
118
+
119
+ return response;
120
+ } catch (error) {
121
+ const trackingId = this.extractTrackingId(error);
122
+ LoggerProxy.error(`AnswerCallOnWebexService.${logMethod} failed: ${error}`, {
123
+ module: ANSWER_CALL_ON_WEBEX_FILE,
124
+ method: logMethod,
125
+ data: {
126
+ trackingId,
127
+ status: extractWxAppHttpStatus(error),
128
+ },
129
+ });
130
+ const {error: detailedError} = getErrorDetails(error, logMethod, CC_FILE);
131
+ throw markWxAppTelephonyError(detailedError, error);
132
+ }
133
+ }
134
+
135
+ public answerCall(params: AnswerCallParams): Promise<IHttpResponse> {
136
+ const {callId, endpointId, lineOwnerId} = params;
137
+
138
+ return this.telephonyRequest(
139
+ '/answer',
140
+ HTTP_METHODS.POST,
141
+ {
142
+ callId,
143
+ endpointId,
144
+ ...(lineOwnerId ? {lineOwnerId} : {}),
145
+ },
146
+ METHODS.ACCEPT
147
+ );
148
+ }
149
+
150
+ public rejectCall(params: CallIdParams): Promise<IHttpResponse> {
151
+ const {callId, lineOwnerId} = params;
152
+
153
+ return this.telephonyRequest(
154
+ '/reject',
155
+ HTTP_METHODS.POST,
156
+ {callId, ...(lineOwnerId ? {lineOwnerId} : {})},
157
+ METHODS.REJECT
158
+ );
159
+ }
160
+
161
+ public muteCall(params: CallIdParams): Promise<IHttpResponse> {
162
+ const {callId, lineOwnerId} = params;
163
+
164
+ return this.telephonyRequest(
165
+ '/mute',
166
+ HTTP_METHODS.POST,
167
+ {callId, ...(lineOwnerId ? {lineOwnerId} : {})},
168
+ METHODS.TOGGLE_MUTE
169
+ );
170
+ }
171
+
172
+ public unmuteCall(params: CallIdParams): Promise<IHttpResponse> {
173
+ const {callId, lineOwnerId} = params;
174
+
175
+ return this.telephonyRequest(
176
+ '/unmute',
177
+ HTTP_METHODS.POST,
178
+ {callId, ...(lineOwnerId ? {lineOwnerId} : {})},
179
+ METHODS.TOGGLE_MUTE
180
+ );
181
+ }
182
+
183
+ public transmitDtmf(params: TransmitDtmfParams): Promise<IHttpResponse> {
184
+ const {callId, dtmf, lineOwnerId} = params;
185
+
186
+ return this.telephonyRequest(
187
+ '/transmitDtmf',
188
+ HTTP_METHODS.POST,
189
+ {callId, dtmf, ...(lineOwnerId ? {lineOwnerId} : {})},
190
+ METHODS.TRANSMIT_DTMF
191
+ );
192
+ }
193
+
194
+ public async getCallDetails(params: CallIdParams): Promise<CallDetailsResponse> {
195
+ const {callId, lineOwnerId} = params;
196
+ const lineOwnerIdQuery = lineOwnerId ? `?lineOwnerId=${encodeURIComponent(lineOwnerId)}` : '';
197
+ const uri = `${this.getTelephonyBaseUrl()}/${callId}${lineOwnerIdQuery}`;
198
+
199
+ try {
200
+ LoggerProxy.log('AnswerCallOnWebexService.getCallDetails request', {
201
+ module: ANSWER_CALL_ON_WEBEX_FILE,
202
+ method: METHODS.GET_CALL_DETAILS_ON_WEBEX,
203
+ data: {callIdSuffix: callId.length <= 8 ? callId : callId.slice(-8)},
204
+ });
205
+
206
+ const response = (await this.webex.request({
207
+ uri,
208
+ method: HTTP_METHODS.GET,
209
+ addAuthHeader: true,
210
+ })) as IHttpResponse;
211
+
212
+ return (response.body ?? {}) as CallDetailsResponse;
213
+ } catch (error) {
214
+ if (isWxAppCallNotFoundError(error)) {
215
+ const err =
216
+ error instanceof Error
217
+ ? error
218
+ : new Error(String((error as {message?: string})?.message ?? error));
219
+ throw markWxAppTelephonyError(err, error);
220
+ }
221
+
222
+ const trackingId = this.extractTrackingId(error);
223
+ LoggerProxy.error(`AnswerCallOnWebexService.getCallDetails failed: ${error}`, {
224
+ module: ANSWER_CALL_ON_WEBEX_FILE,
225
+ method: METHODS.GET_CALL_DETAILS_ON_WEBEX,
226
+ data: {
227
+ trackingId,
228
+ status: extractWxAppHttpStatus(error),
229
+ },
230
+ });
231
+ const {error: detailedError} = getErrorDetails(
232
+ error,
233
+ METHODS.GET_CALL_DETAILS_ON_WEBEX,
234
+ CC_FILE
235
+ );
236
+ throw markWxAppTelephonyError(detailedError, error);
237
+ }
238
+ }
239
+ }