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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.sdd/manifest.json +884 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +53 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +52 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +382 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  19. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  20. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  21. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  22. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  23. package/ai-docs/patterns/testing-patterns.md +480 -0
  24. package/ai-docs/patterns/typescript-patterns.md +365 -0
  25. package/ai-docs/templates/README.md +102 -0
  26. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  27. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  28. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  29. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  30. package/ai-docs/templates/new-method/00-master.md +80 -0
  31. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  32. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  33. package/ai-docs/templates/new-method/03-tests.md +201 -0
  34. package/ai-docs/templates/new-method/04-validation.md +141 -0
  35. package/ai-docs/templates/new-service/00-master.md +109 -0
  36. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  37. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  38. package/ai-docs/templates/new-service/03-integration.md +178 -0
  39. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  40. package/ai-docs/templates/new-service/05-validation.md +145 -0
  41. package/dist/cc.js +971 -42
  42. package/dist/cc.js.map +1 -1
  43. package/dist/config.js +13 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.js +31 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +45 -15
  48. package/dist/index.js.map +1 -1
  49. package/dist/metrics/MetricsManager.js +16 -0
  50. package/dist/metrics/MetricsManager.js.map +1 -1
  51. package/dist/metrics/behavioral-events.js +205 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +48 -4
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/services/AddressBook.js +18 -15
  56. package/dist/services/AddressBook.js.map +1 -1
  57. package/dist/services/AnswerCallOnWebexService.js +202 -0
  58. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  59. package/dist/services/ApiAiAssistant.js +269 -9
  60. package/dist/services/ApiAiAssistant.js.map +1 -1
  61. package/dist/services/EntryPoint.js +46 -68
  62. package/dist/services/EntryPoint.js.map +1 -1
  63. package/dist/services/Queue.js +27 -22
  64. package/dist/services/Queue.js.map +1 -1
  65. package/dist/services/UserPreference.js +427 -0
  66. package/dist/services/UserPreference.js.map +1 -0
  67. package/dist/services/WebexCrossClientService.js +222 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +11 -4
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +41 -7
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +51 -0
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +57 -12
  78. package/dist/services/config/types.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +111 -32
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +28 -14
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/types.js.map +1 -1
  90. package/dist/services/index.js +1 -1
  91. package/dist/services/index.js.map +1 -1
  92. package/dist/services/task/Task.js +754 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +49 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1172 -521
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +211 -27
  99. package/dist/services/task/TaskUtils.js.map +1 -1
  100. package/dist/services/task/WebexCallingUtils.js +70 -0
  101. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  102. package/dist/services/task/constants.js +12 -2
  103. package/dist/services/task/constants.js.map +1 -1
  104. package/dist/services/task/contact.js +29 -0
  105. package/dist/services/task/contact.js.map +1 -1
  106. package/dist/services/task/dialer.js +78 -0
  107. package/dist/services/task/dialer.js.map +1 -1
  108. package/dist/services/task/digital/Digital.js +78 -0
  109. package/dist/services/task/digital/Digital.js.map +1 -0
  110. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  111. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  112. package/dist/services/task/state-machine/actions.js +572 -0
  113. package/dist/services/task/state-machine/actions.js.map +1 -0
  114. package/dist/services/task/state-machine/constants.js +161 -0
  115. package/dist/services/task/state-machine/constants.js.map +1 -0
  116. package/dist/services/task/state-machine/guards.js +379 -0
  117. package/dist/services/task/state-machine/guards.js.map +1 -0
  118. package/dist/services/task/state-machine/index.js +53 -0
  119. package/dist/services/task/state-machine/index.js.map +1 -0
  120. package/dist/services/task/state-machine/types.js +54 -0
  121. package/dist/services/task/state-machine/types.js.map +1 -0
  122. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  123. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  124. package/dist/services/task/taskDataNormalizer.js +99 -0
  125. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  126. package/dist/services/task/types.js +228 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1485 -0
  129. package/dist/services/task/voice/Voice.js.map +1 -0
  130. package/dist/services/task/voice/WebRTC.js +152 -0
  131. package/dist/services/task/voice/WebRTC.js.map +1 -0
  132. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  133. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  134. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  135. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  136. package/dist/services/wxAppTelephonyUtils.js +19 -0
  137. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  138. package/dist/types/cc.d.ts +193 -6
  139. package/dist/types/config.d.ts +13 -0
  140. package/dist/types/constants.d.ts +29 -1
  141. package/dist/types/index.d.ts +35 -8
  142. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  143. package/dist/types/metrics/constants.d.ts +43 -1
  144. package/dist/types/services/AddressBook.d.ts +2 -1
  145. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  146. package/dist/types/services/ApiAiAssistant.d.ts +56 -5
  147. package/dist/types/services/EntryPoint.d.ts +7 -5
  148. package/dist/types/services/Queue.d.ts +5 -3
  149. package/dist/types/services/UserPreference.d.ts +118 -0
  150. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  151. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  152. package/dist/types/services/config/constants.d.ts +34 -5
  153. package/dist/types/services/config/types.d.ts +197 -12
  154. package/dist/types/services/core/Err.d.ts +6 -0
  155. package/dist/types/services/core/Utils.d.ts +35 -13
  156. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  157. package/dist/types/services/core/types.d.ts +2 -0
  158. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  159. package/dist/types/services/core/websocket/types.d.ts +1 -1
  160. package/dist/types/services/index.d.ts +1 -1
  161. package/dist/types/services/task/Task.d.ts +175 -0
  162. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  163. package/dist/types/services/task/TaskUtils.d.ts +48 -2
  164. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  165. package/dist/types/services/task/constants.d.ts +10 -0
  166. package/dist/types/services/task/contact.d.ts +4 -0
  167. package/dist/types/services/task/dialer.d.ts +30 -0
  168. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  169. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  170. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  171. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  172. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  173. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  174. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  175. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  176. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  177. package/dist/types/services/task/types.d.ts +680 -66
  178. package/dist/types/services/task/voice/Voice.d.ts +227 -0
  179. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  180. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  181. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  182. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  183. package/dist/types/types.d.ts +205 -9
  184. package/dist/types/utils/PageCache.d.ts +20 -3
  185. package/dist/types/webex.d.ts +1 -0
  186. package/dist/types.js +162 -4
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/PageCache.js +19 -5
  189. package/dist/utils/PageCache.js.map +1 -1
  190. package/dist/webex.js +22 -2
  191. package/dist/webex.js.map +1 -1
  192. package/package.json +16 -12
  193. package/src/cc.ts +1289 -112
  194. package/src/config.ts +13 -0
  195. package/src/constants.ts +29 -1
  196. package/src/index.ts +36 -5
  197. package/src/metrics/MetricsManager.ts +16 -0
  198. package/src/metrics/ai-docs/AGENTS.md +350 -0
  199. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  200. package/src/metrics/ai-docs/metrics-spec.md +921 -0
  201. package/src/metrics/behavioral-events.ts +212 -0
  202. package/src/metrics/constants.ts +52 -4
  203. package/src/services/AddressBook.ts +17 -6
  204. package/src/services/AnswerCallOnWebexService.ts +239 -0
  205. package/src/services/ApiAiAssistant.ts +356 -9
  206. package/src/services/EntryPoint.ts +59 -60
  207. package/src/services/Queue.ts +29 -12
  208. package/src/services/UserPreference.ts +509 -0
  209. package/src/services/WebexCrossClientService.ts +293 -0
  210. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  211. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  212. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  213. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  214. package/src/services/ai-docs/AGENTS.md +386 -0
  215. package/src/services/ai-docs/services-spec.md +505 -0
  216. package/src/services/config/Util.ts +12 -3
  217. package/src/services/config/ai-docs/AGENTS.md +255 -0
  218. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  219. package/src/services/config/ai-docs/config-spec.md +686 -0
  220. package/src/services/config/constants.ts +46 -6
  221. package/src/services/config/index.ts +65 -0
  222. package/src/services/config/types.ts +197 -13
  223. package/src/services/core/Err.ts +3 -0
  224. package/src/services/core/Utils.ts +127 -37
  225. package/src/services/core/WebexRequest.ts +3 -1
  226. package/src/services/core/ai-docs/AGENTS.md +381 -0
  227. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  228. package/src/services/core/ai-docs/core-spec.md +787 -0
  229. package/src/services/core/aqm-reqs.ts +30 -15
  230. package/src/services/core/types.ts +2 -0
  231. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  232. package/src/services/core/websocket/types.ts +1 -1
  233. package/src/services/index.ts +1 -1
  234. package/src/services/task/Task.ts +908 -0
  235. package/src/services/task/TaskFactory.ts +60 -0
  236. package/src/services/task/TaskManager.ts +1419 -608
  237. package/src/services/task/TaskUtils.ts +303 -25
  238. package/src/services/task/WebexCallingUtils.ts +136 -0
  239. package/src/services/task/ai-docs/AGENTS.md +457 -0
  240. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  241. package/src/services/task/ai-docs/task-spec.md +1474 -0
  242. package/src/services/task/constants.ts +10 -0
  243. package/src/services/task/contact.ts +30 -0
  244. package/src/services/task/dialer.ts +80 -0
  245. package/src/services/task/digital/Digital.ts +97 -0
  246. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  247. package/src/services/task/state-machine/actions.ts +741 -0
  248. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  249. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  250. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  251. package/src/services/task/state-machine/constants.ts +172 -0
  252. package/src/services/task/state-machine/guards.ts +442 -0
  253. package/src/services/task/state-machine/index.ts +28 -0
  254. package/src/services/task/state-machine/types.ts +258 -0
  255. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  256. package/src/services/task/taskDataNormalizer.ts +137 -0
  257. package/src/services/task/types.ts +819 -70
  258. package/src/services/task/voice/Voice.ts +1851 -0
  259. package/src/services/task/voice/WebRTC.ts +191 -0
  260. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  261. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  262. package/src/services/wxAppTelephonyUtils.ts +14 -0
  263. package/src/types.ts +262 -11
  264. package/src/utils/AGENTS.md +289 -0
  265. package/src/utils/PageCache.ts +38 -5
  266. package/src/utils/ai-docs/utils-spec.md +391 -0
  267. package/src/webex.js +10 -0
  268. package/test/unit/spec/cc.ts +2210 -119
  269. package/test/unit/spec/logger-proxy.ts +70 -0
  270. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  271. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  272. package/test/unit/spec/services/AddressBook.ts +37 -6
  273. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  274. package/test/unit/spec/services/ApiAiAssistant.ts +311 -21
  275. package/test/unit/spec/services/EntryPoint.ts +87 -40
  276. package/test/unit/spec/services/Queue.ts +123 -12
  277. package/test/unit/spec/services/UserPreference.ts +401 -0
  278. package/test/unit/spec/services/WebCallingService.ts +7 -1
  279. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  280. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  281. package/test/unit/spec/services/config/Util.ts +129 -0
  282. package/test/unit/spec/services/config/index.ts +97 -29
  283. package/test/unit/spec/services/core/Utils.ts +425 -8
  284. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  285. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  286. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  287. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  288. package/test/unit/spec/services/task/Task.ts +745 -0
  289. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  290. package/test/unit/spec/services/task/TaskManager.ts +2518 -1494
  291. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  292. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  293. package/test/unit/spec/services/task/contact.ts +33 -0
  294. package/test/unit/spec/services/task/dialer.ts +190 -0
  295. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  296. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  297. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  298. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  299. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  300. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  301. package/test/unit/spec/services/task/voice/Voice.ts +2061 -0
  302. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  303. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  304. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  305. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  306. package/umd/contact-center.min.js +2 -2
  307. package/umd/contact-center.min.js.map +1 -1
  308. package/dist/services/task/index.js +0 -1525
  309. package/dist/services/task/index.js.map +0 -1
  310. package/dist/types/services/task/index.d.ts +0 -650
  311. package/src/services/task/index.ts +0 -1801
  312. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AddressBook","constructor","webex","getAddressBookId","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntries","params","startTime","Date","now","addressBookId","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","bookId","orgId","credentials","getOrgId","isSearchRequest","LoggerProxy","info","module","method","data","canUseCache","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","cacheHit","recordCount","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ADDRESSBOOK_FETCH_SUCCESS","errorData","error","trackEvent","ADDRESSBOOK_FETCH_FAILED","Error","queryParams","URLSearchParams","toString","append","resource","endPointMap","addressBookEntries","service","WCC_API_GATEWAY","response","request","HTTP_METHODS","GET","body","statusCode","isFirstPage","cachePage","message","String","exports","_default"],"sources":["AddressBook.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {\n AddressBookEntry,\n AddressBookEntriesResponse,\n AddressBookEntrySearchParams,\n} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * AddressBook API class for managing Webex Contact Center address book entries.\n * Provides functionality to fetch address book entries using the entry API.\n *\n * @class AddressBook\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get AddressBook API instance from ContactCenter\n * const addressBookAPI = cc.addressBook;\n *\n * // Get entries from agent's default address book\n * const entries = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const entries = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entries\n * const searchResults = await addressBook.getEntries({\n * search: 'john',\n * filter: 'name==\"John Doe\"'\n * });\n * ```\n */\nexport class AddressBook {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private getAddressBookId: () => string;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<AddressBookEntry>;\n\n /**\n * Creates an instance of AddressBook\n * @param {WebexSDK} webex - The Webex SDK instance\n * @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile\n * @public\n */\n constructor(webex: WebexSDK, getAddressBookId: () => string) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.getAddressBookId = getAddressBookId;\n this.pageCache = new PageCache<AddressBookEntry>('AddressBook');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches address book entries for a specific address book using the entry API\n * @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId\n * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get entries from agent's default address book\n * const response = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const response = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntries(\n params: AddressBookEntrySearchParams = {}\n ): Promise<AddressBookEntriesResponse> {\n const startTime = Date.now();\n const {\n addressBookId,\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n } = params;\n\n // Use provided addressBookId or fall back to agent's address book\n const bookId = addressBookId || this.getAddressBookId();\n const orgId = this.webex.credentials.getOrgId();\n const isSearchRequest = !!(search || filter || attributes);\n\n LoggerProxy.info('Fetching address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n orgId,\n bookId,\n page,\n pageSize,\n isSearchRequest,\n },\n });\n\n // Check if we can use cache for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes})) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.info(`Returning page ${page} from cache`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheHit: true,\n duration,\n recordCount: cachedPage.data.length,\n page,\n pageSize,\n },\n });\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing for the operation\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);\n\n // Validate address book id early to avoid bad requests\n if (!bookId) {\n const errorData = {\n orgId,\n bookId,\n isSearchRequest,\n page,\n pageSize,\n error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.',\n };\n LoggerProxy.error('AddressBook called without a valid addressBookId', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n });\n\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw new Error('AddressBook: addressBookId is not available for the current agent.');\n }\n\n try {\n // Build query parameters according to spec\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n });\n\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (search) queryParams.append('search', search);\n\n const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());\n\n LoggerProxy.info('Making API request to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n resource,\n service: WCC_API_GATEWAY,\n },\n });\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.info(`Successfully retrieved ${recordCount} address book entries`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS,\n {\n orgId,\n bookId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral', 'operational']\n );\n }\n\n // Cache the page data for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes}) && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.info('Cached address book entries for future requests', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheKey,\n recordCount,\n },\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n bookId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error('Failed to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default AddressBook;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AddressBook","constructor","webex","getAddressBookId","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntries","params","startTime","Date","now","addressBookId","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","sortBy","sortOrder","bookId","orgId","credentials","getOrgId","hasCustomSort","isSearchRequest","canUseCache","undefined","LoggerProxy","info","module","method","data","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","cacheHit","recordCount","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ADDRESSBOOK_FETCH_SUCCESS","errorData","error","trackEvent","ADDRESSBOOK_FETCH_FAILED","Error","queryParams","URLSearchParams","toString","append","toUpperCase","resource","endPointMap","addressBookEntries","service","WCC_API_GATEWAY","response","request","HTTP_METHODS","GET","body","statusCode","isFirstPage","cachePage","message","String","exports","_default"],"sources":["AddressBook.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {\n AddressBookEntry,\n AddressBookEntriesResponse,\n AddressBookEntrySearchParams,\n} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * AddressBook API class for managing Webex Contact Center address book entries.\n * Provides functionality to fetch address book entries using the entry API.\n *\n * @class AddressBook\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get AddressBook API instance from ContactCenter\n * const addressBookAPI = cc.addressBook;\n *\n * // Get entries from agent's default address book\n * const entries = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const entries = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entries\n * const searchResults = await addressBook.getEntries({\n * search: 'john',\n * filter: 'name==\"John Doe\"'\n * });\n * ```\n */\nexport class AddressBook {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private getAddressBookId: () => string;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<AddressBookEntry>;\n\n /**\n * Creates an instance of AddressBook\n * @param {WebexSDK} webex - The Webex SDK instance\n * @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile\n * @public\n */\n constructor(webex: WebexSDK, getAddressBookId: () => string) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.getAddressBookId = getAddressBookId;\n this.pageCache = new PageCache<AddressBookEntry>('AddressBook');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches address book entries for a specific address book using the entry API\n * @param {AddressBookEntrySearchParams} [params] - Search, pagination, and optional sort parameters\n * including addressBookId. Sorting defaults to name ascending.\n * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get entries from agent's default address book\n * const response = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const response = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntries(\n params: AddressBookEntrySearchParams = {}\n ): Promise<AddressBookEntriesResponse> {\n const startTime = Date.now();\n const {\n addressBookId,\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n sortBy = 'name',\n sortOrder = 'asc',\n } = params;\n\n // Use provided addressBookId or fall back to agent's address book\n const bookId = addressBookId || this.getAddressBookId();\n const orgId = this.webex.credentials.getOrgId();\n const hasCustomSort = sortBy !== 'name' || sortOrder !== 'asc';\n const isSearchRequest = !!(search || filter || attributes || hasCustomSort);\n const canUseCache = this.pageCache.canUseCache({\n search,\n filter,\n attributes,\n sortBy: hasCustomSort ? sortBy : undefined,\n });\n\n LoggerProxy.info('Fetching address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n orgId,\n bookId,\n page,\n pageSize,\n isSearchRequest,\n },\n });\n\n // Default name-ascending pagination is cache-compatible; result-changing overrides are not.\n if (canUseCache) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.info(`Returning page ${page} from cache`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheHit: true,\n duration,\n recordCount: cachedPage.data.length,\n page,\n pageSize,\n },\n });\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing for the operation\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);\n\n // Validate address book id early to avoid bad requests\n if (!bookId) {\n const errorData = {\n orgId,\n bookId,\n isSearchRequest,\n page,\n pageSize,\n error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.',\n };\n LoggerProxy.error('AddressBook called without a valid addressBookId', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n });\n\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw new Error('AddressBook: addressBookId is not available for the current agent.');\n }\n\n try {\n // Build query parameters according to spec\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n });\n\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (search) queryParams.append('search', search);\n if (sortBy) queryParams.append('sort', `${sortBy},${sortOrder.toUpperCase()}`);\n\n const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());\n\n LoggerProxy.info('Making API request to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n resource,\n service: WCC_API_GATEWAY,\n },\n });\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.info(`Successfully retrieved ${recordCount} address book entries`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS,\n {\n orgId,\n bookId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral', 'operational']\n );\n }\n\n // Cache only the invariant default-order pagination shape.\n if (canUseCache && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.info('Cached address book entries for future requests', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheKey,\n recordCount,\n },\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n bookId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error('Failed to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default AddressBook;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
8
+ var _constants = require("../constants");
9
+ var _types = require("../types");
10
+ var _Utils = require("./core/Utils");
11
+ var _wxAppTelephonyUtils = require("./wxAppTelephonyUtils");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const ANSWER_CALL_ON_WEBEX_FILE = 'AnswerCallOnWebexService';
14
+ const extractWxAppTrackingId = source => {
15
+ const sourceObj = source;
16
+ return sourceObj?.details?.trackingId || sourceObj?.trackingId;
17
+ };
18
+ const extractWxAppHttpStatus = source => {
19
+ const obj = source;
20
+ return obj?.statusCode ?? obj?.status ?? obj?.details?.status;
21
+ };
22
+ const markWxAppTelephonyError = (error, source) => {
23
+ const marked = error;
24
+ marked.isWxAppTelephonyError = true;
25
+ const trackingId = extractWxAppTrackingId(source);
26
+ if (trackingId) {
27
+ marked.trackingId = trackingId;
28
+ }
29
+ const status = extractWxAppHttpStatus(source);
30
+ if (status !== undefined) {
31
+ marked.status = status;
32
+ }
33
+ return marked;
34
+ };
35
+ /**
36
+ * REST telephony client for wxApp thick-client answer (WXCC-6026).
37
+ * Separate from WebCallingService (WebRTC/Mobius).
38
+ */
39
+ class AnswerCallOnWebexService {
40
+ constructor(webex) {
41
+ this.webex = webex;
42
+ }
43
+ getTelephonyBaseUrl() {
44
+ const services = this.webex.internal.services;
45
+ const hydraUrl = services._serviceUrls?.hydra || services.get('hydra');
46
+ if (!hydraUrl) {
47
+ throw new Error('Telephony base URL is unavailable');
48
+ }
49
+ return `${hydraUrl.replace(/\/$/, '')}/telephony/calls`;
50
+ }
51
+ extractTrackingId(source) {
52
+ return extractWxAppTrackingId(source);
53
+ }
54
+ async telephonyRequest(resource, method, body, logMethod) {
55
+ try {
56
+ const uri = `${this.getTelephonyBaseUrl()}${resource}`;
57
+ _loggerProxy.default.info(`AnswerCallOnWebexService.${logMethod} request`, {
58
+ module: ANSWER_CALL_ON_WEBEX_FILE,
59
+ method: logMethod,
60
+ data: {
61
+ uri,
62
+ bodyKeys: Object.keys(body)
63
+ }
64
+ });
65
+ const response = await this.webex.request({
66
+ uri,
67
+ method,
68
+ body,
69
+ addAuthHeader: true
70
+ });
71
+ _loggerProxy.default.info(`AnswerCallOnWebexService.${logMethod} success`, {
72
+ module: ANSWER_CALL_ON_WEBEX_FILE,
73
+ method: logMethod,
74
+ data: {
75
+ statusCode: response.statusCode
76
+ }
77
+ });
78
+ return response;
79
+ } catch (error) {
80
+ const trackingId = this.extractTrackingId(error);
81
+ _loggerProxy.default.error(`AnswerCallOnWebexService.${logMethod} failed: ${error}`, {
82
+ module: ANSWER_CALL_ON_WEBEX_FILE,
83
+ method: logMethod,
84
+ data: {
85
+ trackingId,
86
+ status: extractWxAppHttpStatus(error)
87
+ }
88
+ });
89
+ const {
90
+ error: detailedError
91
+ } = (0, _Utils.getErrorDetails)(error, logMethod, _constants.CC_FILE);
92
+ throw markWxAppTelephonyError(detailedError, error);
93
+ }
94
+ }
95
+ answerCall(params) {
96
+ const {
97
+ callId,
98
+ endpointId,
99
+ lineOwnerId
100
+ } = params;
101
+ return this.telephonyRequest('/answer', _types.HTTP_METHODS.POST, {
102
+ callId,
103
+ endpointId,
104
+ ...(lineOwnerId ? {
105
+ lineOwnerId
106
+ } : {})
107
+ }, _constants.METHODS.ACCEPT);
108
+ }
109
+ rejectCall(params) {
110
+ const {
111
+ callId,
112
+ lineOwnerId
113
+ } = params;
114
+ return this.telephonyRequest('/reject', _types.HTTP_METHODS.POST, {
115
+ callId,
116
+ ...(lineOwnerId ? {
117
+ lineOwnerId
118
+ } : {})
119
+ }, _constants.METHODS.REJECT);
120
+ }
121
+ muteCall(params) {
122
+ const {
123
+ callId,
124
+ lineOwnerId
125
+ } = params;
126
+ return this.telephonyRequest('/mute', _types.HTTP_METHODS.POST, {
127
+ callId,
128
+ ...(lineOwnerId ? {
129
+ lineOwnerId
130
+ } : {})
131
+ }, _constants.METHODS.TOGGLE_MUTE);
132
+ }
133
+ unmuteCall(params) {
134
+ const {
135
+ callId,
136
+ lineOwnerId
137
+ } = params;
138
+ return this.telephonyRequest('/unmute', _types.HTTP_METHODS.POST, {
139
+ callId,
140
+ ...(lineOwnerId ? {
141
+ lineOwnerId
142
+ } : {})
143
+ }, _constants.METHODS.TOGGLE_MUTE);
144
+ }
145
+ transmitDtmf(params) {
146
+ const {
147
+ callId,
148
+ dtmf,
149
+ lineOwnerId
150
+ } = params;
151
+ return this.telephonyRequest('/transmitDtmf', _types.HTTP_METHODS.POST, {
152
+ callId,
153
+ dtmf,
154
+ ...(lineOwnerId ? {
155
+ lineOwnerId
156
+ } : {})
157
+ }, _constants.METHODS.TRANSMIT_DTMF);
158
+ }
159
+ async getCallDetails(params) {
160
+ const {
161
+ callId,
162
+ lineOwnerId
163
+ } = params;
164
+ const lineOwnerIdQuery = lineOwnerId ? `?lineOwnerId=${encodeURIComponent(lineOwnerId)}` : '';
165
+ const uri = `${this.getTelephonyBaseUrl()}/${callId}${lineOwnerIdQuery}`;
166
+ try {
167
+ _loggerProxy.default.info('AnswerCallOnWebexService.getCallDetails request', {
168
+ module: ANSWER_CALL_ON_WEBEX_FILE,
169
+ method: _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX,
170
+ data: {
171
+ callId
172
+ }
173
+ });
174
+ const response = await this.webex.request({
175
+ uri,
176
+ method: _types.HTTP_METHODS.GET,
177
+ addAuthHeader: true
178
+ });
179
+ return response.body ?? {};
180
+ } catch (error) {
181
+ if ((0, _wxAppTelephonyUtils.isWxAppCallNotFoundError)(error)) {
182
+ const err = error instanceof Error ? error : new Error(String(error?.message ?? error));
183
+ throw markWxAppTelephonyError(err, error);
184
+ }
185
+ const trackingId = this.extractTrackingId(error);
186
+ _loggerProxy.default.error(`AnswerCallOnWebexService.getCallDetails failed: ${error}`, {
187
+ module: ANSWER_CALL_ON_WEBEX_FILE,
188
+ method: _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX,
189
+ data: {
190
+ trackingId,
191
+ status: extractWxAppHttpStatus(error)
192
+ }
193
+ });
194
+ const {
195
+ error: detailedError
196
+ } = (0, _Utils.getErrorDetails)(error, _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX, _constants.CC_FILE);
197
+ throw markWxAppTelephonyError(detailedError, error);
198
+ }
199
+ }
200
+ }
201
+ exports.default = AnswerCallOnWebexService;
202
+ //# sourceMappingURL=AnswerCallOnWebexService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_types","_Utils","_wxAppTelephonyUtils","e","__esModule","default","ANSWER_CALL_ON_WEBEX_FILE","extractWxAppTrackingId","source","sourceObj","details","trackingId","extractWxAppHttpStatus","obj","statusCode","status","markWxAppTelephonyError","error","marked","isWxAppTelephonyError","undefined","AnswerCallOnWebexService","constructor","webex","getTelephonyBaseUrl","services","internal","hydraUrl","_serviceUrls","hydra","get","Error","replace","extractTrackingId","telephonyRequest","resource","method","body","logMethod","uri","LoggerProxy","info","module","data","bodyKeys","Object","keys","response","request","addAuthHeader","detailedError","getErrorDetails","CC_FILE","answerCall","params","callId","endpointId","lineOwnerId","HTTP_METHODS","POST","METHODS","ACCEPT","rejectCall","REJECT","muteCall","TOGGLE_MUTE","unmuteCall","transmitDtmf","dtmf","TRANSMIT_DTMF","getCallDetails","lineOwnerIdQuery","encodeURIComponent","GET_CALL_DETAILS_ON_WEBEX","GET","isWxAppCallNotFoundError","err","String","message","exports"],"sources":["AnswerCallOnWebexService.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport {CC_FILE, METHODS} from '../constants';\nimport {HTTP_METHODS, IHttpResponse, WebexSDK} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport {isWxAppCallNotFoundError} from './wxAppTelephonyUtils';\n\nconst ANSWER_CALL_ON_WEBEX_FILE = 'AnswerCallOnWebexService';\n\nexport type WxAppTelephonyError = Error & {\n isWxAppTelephonyError: true;\n trackingId?: string;\n status?: number | string;\n};\n\nconst extractWxAppTrackingId = (source: unknown): string | undefined => {\n const sourceObj = source as {details?: {trackingId?: string}; trackingId?: string};\n\n return sourceObj?.details?.trackingId || sourceObj?.trackingId;\n};\n\nconst extractWxAppHttpStatus = (source: unknown): number | string | undefined => {\n const obj = source as {\n statusCode?: number;\n status?: number | string;\n details?: {status?: number | string};\n };\n\n return obj?.statusCode ?? obj?.status ?? obj?.details?.status;\n};\n\nconst markWxAppTelephonyError = (error: Error, source: unknown): WxAppTelephonyError => {\n const marked = error as WxAppTelephonyError;\n marked.isWxAppTelephonyError = true;\n const trackingId = extractWxAppTrackingId(source);\n if (trackingId) {\n marked.trackingId = trackingId;\n }\n const status = extractWxAppHttpStatus(source);\n if (status !== undefined) {\n marked.status = status;\n }\n\n return marked;\n};\n\nexport type AnswerCallParams = {\n callId: string;\n endpointId: string;\n lineOwnerId?: string;\n};\n\nexport type CallIdParams = {\n callId: string;\n lineOwnerId?: string;\n};\n\nexport type TransmitDtmfParams = CallIdParams & {\n dtmf: string;\n};\n\nexport type CallDetailsResponse = {\n muted?: boolean;\n};\n\n/**\n * REST telephony client for wxApp thick-client answer (WXCC-6026).\n * Separate from WebCallingService (WebRTC/Mobius).\n */\nexport default class AnswerCallOnWebexService {\n private webex: WebexSDK;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n }\n\n private getTelephonyBaseUrl(): string {\n const services = this.webex.internal.services;\n const hydraUrl = services._serviceUrls?.hydra || services.get('hydra');\n\n if (!hydraUrl) {\n throw new Error('Telephony base URL is unavailable');\n }\n\n return `${hydraUrl.replace(/\\/$/, '')}/telephony/calls`;\n }\n\n private extractTrackingId(source: unknown): string | undefined {\n return extractWxAppTrackingId(source);\n }\n\n private async telephonyRequest(\n resource: string,\n method: HTTP_METHODS,\n body: Record<string, unknown>,\n logMethod: string\n ): Promise<IHttpResponse> {\n try {\n const uri = `${this.getTelephonyBaseUrl()}${resource}`;\n\n LoggerProxy.info(`AnswerCallOnWebexService.${logMethod} request`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {uri, bodyKeys: Object.keys(body)},\n });\n\n const response = (await this.webex.request({\n uri,\n method,\n body,\n addAuthHeader: true,\n })) as IHttpResponse;\n\n LoggerProxy.info(`AnswerCallOnWebexService.${logMethod} success`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {statusCode: response.statusCode},\n });\n\n return response;\n } catch (error) {\n const trackingId = this.extractTrackingId(error);\n LoggerProxy.error(`AnswerCallOnWebexService.${logMethod} failed: ${error}`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {\n trackingId,\n status: extractWxAppHttpStatus(error),\n },\n });\n const {error: detailedError} = getErrorDetails(error, logMethod, CC_FILE);\n throw markWxAppTelephonyError(detailedError, error);\n }\n }\n\n public answerCall(params: AnswerCallParams): Promise<IHttpResponse> {\n const {callId, endpointId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/answer',\n HTTP_METHODS.POST,\n {\n callId,\n endpointId,\n ...(lineOwnerId ? {lineOwnerId} : {}),\n },\n METHODS.ACCEPT\n );\n }\n\n public rejectCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/reject',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.REJECT\n );\n }\n\n public muteCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/mute',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TOGGLE_MUTE\n );\n }\n\n public unmuteCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/unmute',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TOGGLE_MUTE\n );\n }\n\n public transmitDtmf(params: TransmitDtmfParams): Promise<IHttpResponse> {\n const {callId, dtmf, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/transmitDtmf',\n HTTP_METHODS.POST,\n {callId, dtmf, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TRANSMIT_DTMF\n );\n }\n\n public async getCallDetails(params: CallIdParams): Promise<CallDetailsResponse> {\n const {callId, lineOwnerId} = params;\n const lineOwnerIdQuery = lineOwnerId ? `?lineOwnerId=${encodeURIComponent(lineOwnerId)}` : '';\n const uri = `${this.getTelephonyBaseUrl()}/${callId}${lineOwnerIdQuery}`;\n\n try {\n LoggerProxy.info('AnswerCallOnWebexService.getCallDetails request', {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: METHODS.GET_CALL_DETAILS_ON_WEBEX,\n data: {callId},\n });\n\n const response = (await this.webex.request({\n uri,\n method: HTTP_METHODS.GET,\n addAuthHeader: true,\n })) as IHttpResponse;\n\n return (response.body ?? {}) as CallDetailsResponse;\n } catch (error) {\n if (isWxAppCallNotFoundError(error)) {\n const err =\n error instanceof Error\n ? error\n : new Error(String((error as {message?: string})?.message ?? error));\n throw markWxAppTelephonyError(err, error);\n }\n\n const trackingId = this.extractTrackingId(error);\n LoggerProxy.error(`AnswerCallOnWebexService.getCallDetails failed: ${error}`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: METHODS.GET_CALL_DETAILS_ON_WEBEX,\n data: {\n trackingId,\n status: extractWxAppHttpStatus(error),\n },\n });\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_CALL_DETAILS_ON_WEBEX,\n CC_FILE\n );\n throw markWxAppTelephonyError(detailedError, error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.ApiAIAssistant = void 0;
7
+ var _uuid = require("uuid");
7
8
  var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
8
9
  var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
9
10
  var _constants = require("../metrics/constants");
@@ -17,8 +18,21 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
17
18
  * @public
18
19
  */
19
20
  class ApiAIAssistant {
20
- constructor(webex) {
21
+ createWellnessError(reason) {
22
+ const error = new Error(reason);
23
+ error.details = {
24
+ type: 'SDK_VALIDATION_ERROR',
25
+ orgId: this.webex.credentials.getOrgId(),
26
+ trackingId: '',
27
+ data: {
28
+ reason
29
+ }
30
+ };
31
+ return error;
32
+ }
33
+ constructor(webex, wellnessContextProvider) {
21
34
  this.webex = webex;
35
+ this.wellnessContextProvider = wellnessContextProvider;
22
36
  this.metricsManager = _MetricsManager.default.getInstance({
23
37
  webex
24
38
  });
@@ -26,6 +40,108 @@ class ApiAIAssistant {
26
40
  setAIFeatureFlags(aiFeature) {
27
41
  this.aiFeature = aiFeature;
28
42
  }
43
+ async sendWellnessBreakAction(action, method) {
44
+ this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
45
+ try {
46
+ const context = this.wellnessContextProvider?.();
47
+ const agentId = context?.agentId?.trim();
48
+ const agentSessionId = context?.agentSessionId?.trim();
49
+ const orgId = this.webex.credentials.getOrgId()?.trim();
50
+ if (context?.isWellnessBreakEnabled !== true) {
51
+ throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');
52
+ }
53
+ if (!orgId) {
54
+ throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');
55
+ }
56
+ if (!agentId) {
57
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');
58
+ }
59
+ if (!agentSessionId) {
60
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');
61
+ }
62
+ const baseUrl = this.getBaseUrl();
63
+ const response = await this.webex.request({
64
+ uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
65
+ method: _types.HTTP_METHODS.POST,
66
+ addAuthHeader: true,
67
+ body: {
68
+ agentId,
69
+ orgId,
70
+ eventType: _types.AIAssistantEventType.CUSTOM_EVENT,
71
+ eventName: _types.AIAssistantEventName.WELLNESS_BREAK_ACTION,
72
+ eventDetails: {
73
+ data: {
74
+ action,
75
+ agentSessionId,
76
+ actionTimeStamp: Date.now()
77
+ }
78
+ }
79
+ }
80
+ });
81
+ if (response.statusCode !== 202) {
82
+ throw this.createWellnessError(`WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`);
83
+ }
84
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, {
85
+ action
86
+ }, ['operational']);
87
+ _loggerProxy.default.log('Wellness action accepted by AI Assistant', {
88
+ module: _constants2.CC_FILE,
89
+ method,
90
+ data: {
91
+ action
92
+ }
93
+ });
94
+ } catch (error) {
95
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED, {
96
+ action,
97
+ error: error instanceof Error ? error.message : String(error)
98
+ }, ['operational']);
99
+ const {
100
+ error: detailedError
101
+ } = (0, _Utils.getErrorDetails)(error, method, _constants2.CC_FILE);
102
+ throw detailedError;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Requests an Agent Wellness Break.
108
+ * The promise resolves when the HTTP request is accepted with status 202; the later
109
+ * approval or denial is delivered independently through a wellness notification.
110
+ * @returns A promise that resolves with no value after HTTP acceptance
111
+ * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
112
+ * @example
113
+ * await webex.cc.apiAIAssistant.requestWellnessBreak();
114
+ * @public
115
+ */
116
+ async requestWellnessBreak() {
117
+ return this.sendWellnessBreakAction(_types.WELLNESS_BREAK_USER_ACTIONS.REQUESTED, _constants2.METHODS.REQUEST_WELLNESS_BREAK);
118
+ }
119
+
120
+ /**
121
+ * Responds to a backend-provided Agent Wellness Break offer.
122
+ * The promise resolves when the HTTP request is accepted with status 202 and does not
123
+ * wait for a WebSocket completion event.
124
+ * @param params - ACCEPTED, REJECTED, or NO_RESPONSE
125
+ * @returns A promise that resolves with no value after HTTP acceptance
126
+ * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
127
+ * @example
128
+ * await webex.cc.apiAIAssistant.respondToWellnessBreak({
129
+ * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,
130
+ * });
131
+ * @public
132
+ */
133
+ async respondToWellnessBreak(params) {
134
+ const {
135
+ action
136
+ } = params;
137
+ if (![_types.WELLNESS_BREAK_USER_ACTIONS.ACCEPTED, _types.WELLNESS_BREAK_USER_ACTIONS.REJECTED, _types.WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE].includes(action)) {
138
+ const {
139
+ error
140
+ } = (0, _Utils.getErrorDetails)(this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'), _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK, _constants2.CC_FILE);
141
+ throw error;
142
+ }
143
+ return this.sendWellnessBreakAction(action, _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK);
144
+ }
29
145
  getBaseUrl() {
30
146
  const wccApiGatewayUrl = this.webex.internal.services.get(_constants3.WCC_API_GATEWAY) || '';
31
147
  if (!wccApiGatewayUrl) {
@@ -56,9 +172,11 @@ class ApiAIAssistant {
56
172
  * @param interactionId - interaction/conversation identifier
57
173
  * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
58
174
  * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
59
- * @param action - action within eventDetails (e.g. 'START' or 'STOP')
175
+ * @param eventMetaData - event-specific fields to include in eventDetails.data
176
+ * @param languageCode - language code within eventDetails.data
177
+ * @param trackingId - tracking identifier within eventDetails.data
60
178
  */
61
- async sendEvent(agentId, interactionId, eventType, eventName, action) {
179
+ async sendEvent(agentId, interactionId, eventType, eventName, eventMetaData, languageCode, trackingId) {
62
180
  _loggerProxy.default.info('Sending event', {
63
181
  module: _constants2.CC_FILE,
64
182
  method: _constants2.METHODS.SEND_EVENT,
@@ -66,7 +184,7 @@ class ApiAIAssistant {
66
184
  data: {
67
185
  eventType,
68
186
  eventName,
69
- action
187
+ eventMetaData
70
188
  }
71
189
  });
72
190
  this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED]);
@@ -84,9 +202,11 @@ class ApiAIAssistant {
84
202
  eventName,
85
203
  eventDetails: {
86
204
  data: {
205
+ ...eventMetaData,
87
206
  interactionId,
88
- action,
89
- actionTimeStamp: String(Date.now())
207
+ actionTimeStamp: String(Date.now()),
208
+ languageCode,
209
+ trackingId
90
210
  }
91
211
  }
92
212
  }
@@ -96,8 +216,7 @@ class ApiAIAssistant {
96
216
  orgId,
97
217
  interactionId,
98
218
  eventType,
99
- eventName,
100
- action
219
+ eventName
101
220
  }, ['operational']);
102
221
  return response?.body || {};
103
222
  } catch (error) {
@@ -105,7 +224,6 @@ class ApiAIAssistant {
105
224
  interactionId,
106
225
  eventType,
107
226
  eventName,
108
- action,
109
227
  error: error instanceof Error ? error.message : String(error)
110
228
  }, ['operational']);
111
229
  const {
@@ -115,6 +233,148 @@ class ApiAIAssistant {
115
233
  }
116
234
  }
117
235
 
236
+ /**
237
+ * Requests real-time assistance for an interaction.
238
+ *
239
+ * @param params - Real-time assistance request parameters
240
+ * @returns HTTP response body from the AI Assistant event API
241
+ * @public
242
+ */
243
+ async getRealTimeAssistance(params) {
244
+ const {
245
+ agentId,
246
+ interactionId,
247
+ context
248
+ } = params;
249
+ const trimmedContext = context?.trim();
250
+ const languageCode = params.languageCode ?? 'en';
251
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
252
+ const eventName = trimmedContext ? _types.AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT : _types.AIAssistantEventName.GET_SUGGESTIONS;
253
+ const loggerContext = {
254
+ module: _constants2.CC_FILE,
255
+ method: _constants2.METHODS.GET_REAL_TIME_ASSISTANCE,
256
+ interactionId,
257
+ trackingId,
258
+ data: {
259
+ eventName
260
+ }
261
+ };
262
+ _loggerProxy.default.info('Requesting real-time assistance', loggerContext);
263
+ this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED]);
264
+ try {
265
+ if (!this.aiFeature?.suggestedResponses?.enable) {
266
+ const {
267
+ error: detailedError
268
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
269
+ throw detailedError;
270
+ }
271
+ const orgId = this.webex.credentials.getOrgId();
272
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, eventName, trimmedContext !== undefined ? {
273
+ context: trimmedContext
274
+ } : undefined, languageCode, trackingId);
275
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, {
276
+ agentId,
277
+ orgId,
278
+ interactionId,
279
+ eventName,
280
+ trackingId,
281
+ context
282
+ }, ['operational']);
283
+ _loggerProxy.default.log('Real-time assistance request succeeded', loggerContext);
284
+ return response;
285
+ } catch (error) {
286
+ _loggerProxy.default.error('Real-time assistance request failed', {
287
+ ...loggerContext,
288
+ error
289
+ });
290
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED, {
291
+ agentId,
292
+ interactionId,
293
+ trackingId,
294
+ eventName,
295
+ error: error instanceof Error ? error.message : String(error)
296
+ }, ['operational']);
297
+ const {
298
+ error: detailedError
299
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
300
+ throw detailedError;
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Sends user action feedback for a real-time assistance adaptive card.
306
+ *
307
+ * @param params - Real-time assistance user action parameters
308
+ * @returns HTTP response body from the AI Assistant event API
309
+ * @public
310
+ */
311
+ async sendRealTimeAssistanceUserAction(params) {
312
+ const {
313
+ agentId,
314
+ interactionId,
315
+ adaptiveCardId,
316
+ actionId
317
+ } = params;
318
+ const actionType = 'Action.Submit';
319
+ const languageCode = params.languageCode ?? 'en';
320
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
321
+ const loggerContext = {
322
+ module: _constants2.CC_FILE,
323
+ method: _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
324
+ interactionId,
325
+ trackingId,
326
+ data: {
327
+ actionId,
328
+ adaptiveCardId
329
+ }
330
+ };
331
+ _loggerProxy.default.info('Sending real-time assistance user action', loggerContext);
332
+ this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED]);
333
+ try {
334
+ if (!this.aiFeature?.suggestedResponses?.enable) {
335
+ const {
336
+ error: detailedError
337
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
338
+ throw detailedError;
339
+ }
340
+ const orgId = this.webex.credentials.getOrgId();
341
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, _types.AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION, {
342
+ adaptiveCardId,
343
+ userAction: {
344
+ actionType,
345
+ actionId
346
+ }
347
+ }, languageCode, trackingId);
348
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, {
349
+ agentId,
350
+ orgId,
351
+ interactionId,
352
+ adaptiveCardId,
353
+ actionId,
354
+ trackingId
355
+ }, ['operational']);
356
+ _loggerProxy.default.log('Real-time assistance user action sent', loggerContext);
357
+ return response;
358
+ } catch (error) {
359
+ _loggerProxy.default.error('Real-time assistance user action failed', {
360
+ ...loggerContext,
361
+ error
362
+ });
363
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED, {
364
+ agentId,
365
+ interactionId,
366
+ adaptiveCardId,
367
+ actionId,
368
+ trackingId,
369
+ error: error instanceof Error ? error.message : String(error)
370
+ }, ['operational']);
371
+ const {
372
+ error: detailedError
373
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
374
+ throw detailedError;
375
+ }
376
+ }
377
+
118
378
  /**
119
379
  * Fetches historic transcripts for an interaction.
120
380
  * This API is allowed only when real-time transcription feature is enabled.