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

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
@@ -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,24 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
17
18
  * @public
18
19
  */
19
20
  class ApiAIAssistant {
20
- constructor(webex) {
21
+ /** @internal Current AI flags from the agent configuration. */
22
+
23
+ pendingRtdRequests = new Map();
24
+ createWellnessError(reason) {
25
+ const error = new Error(reason);
26
+ error.details = {
27
+ type: 'SDK_VALIDATION_ERROR',
28
+ orgId: this.webex.credentials.getOrgId(),
29
+ trackingId: '',
30
+ data: {
31
+ reason
32
+ }
33
+ };
34
+ return error;
35
+ }
36
+ constructor(webex, wellnessContextProvider) {
21
37
  this.webex = webex;
38
+ this.wellnessContextProvider = wellnessContextProvider;
22
39
  this.metricsManager = _MetricsManager.default.getInstance({
23
40
  webex
24
41
  });
@@ -26,12 +43,126 @@ class ApiAIAssistant {
26
43
  setAIFeatureFlags(aiFeature) {
27
44
  this.aiFeature = aiFeature;
28
45
  }
46
+
47
+ /**
48
+ * Validates a caller-supplied identifier (agentId/interactionId) before it is used to
49
+ * construct a request. Accepts a non-empty alphanumeric identifier that may contain
50
+ * hyphens or underscores.
51
+ * @param value - the identifier to validate
52
+ * @returns {boolean} true when the identifier is a non-empty, well-formed string
53
+ * @private
54
+ */
55
+ isValidTranscriptIdentifier(value) {
56
+ return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);
57
+ }
58
+ async sendWellnessBreakAction(action, method) {
59
+ this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
60
+ try {
61
+ const context = this.wellnessContextProvider?.();
62
+ const agentId = context?.agentId?.trim();
63
+ const agentSessionId = context?.agentSessionId?.trim();
64
+ const orgId = this.webex.credentials.getOrgId()?.trim();
65
+ if (context?.isWellnessBreakEnabled !== true) {
66
+ throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');
67
+ }
68
+ if (!orgId) {
69
+ throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');
70
+ }
71
+ if (!agentId) {
72
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');
73
+ }
74
+ if (!agentSessionId) {
75
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');
76
+ }
77
+ const baseUrl = this.getBaseUrl();
78
+ const response = await this.webex.request({
79
+ uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
80
+ method: _types.HTTP_METHODS.POST,
81
+ addAuthHeader: true,
82
+ body: {
83
+ agentId,
84
+ orgId,
85
+ eventType: _types.AIAssistantEventType.CUSTOM_EVENT,
86
+ eventName: _types.AIAssistantEventName.WELLNESS_BREAK_ACTION,
87
+ eventDetails: {
88
+ data: {
89
+ action,
90
+ agentSessionId,
91
+ actionTimeStamp: Date.now()
92
+ }
93
+ }
94
+ }
95
+ });
96
+ if (response.statusCode !== 202) {
97
+ throw this.createWellnessError(`WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`);
98
+ }
99
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, {
100
+ action
101
+ }, ['operational']);
102
+ _loggerProxy.default.log('Wellness action accepted by AI Assistant', {
103
+ module: _constants2.CC_FILE,
104
+ method,
105
+ data: {
106
+ action
107
+ }
108
+ });
109
+ } catch (error) {
110
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED, {
111
+ action,
112
+ error: error instanceof Error ? error.message : String(error)
113
+ }, ['operational']);
114
+ const {
115
+ error: detailedError
116
+ } = (0, _Utils.getErrorDetails)(error, method, _constants2.CC_FILE);
117
+ throw detailedError;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Requests an Agent Wellness Break.
123
+ * The promise resolves when the HTTP request is accepted with status 202; the later
124
+ * approval or denial is delivered independently through a wellness notification.
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.requestWellnessBreak();
129
+ * @public
130
+ */
131
+ async requestWellnessBreak() {
132
+ return this.sendWellnessBreakAction(_types.WELLNESS_BREAK_USER_ACTIONS.REQUESTED, _constants2.METHODS.REQUEST_WELLNESS_BREAK);
133
+ }
134
+
135
+ /**
136
+ * Responds to a backend-provided Agent Wellness Break offer.
137
+ * The promise resolves when the HTTP request is accepted with status 202 and does not
138
+ * wait for a WebSocket completion event.
139
+ * @param params - ACCEPTED, REJECTED, or NO_RESPONSE
140
+ * @returns A promise that resolves with no value after HTTP acceptance
141
+ * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
142
+ * @example
143
+ * await webex.cc.apiAIAssistant.respondToWellnessBreak({
144
+ * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,
145
+ * });
146
+ * @public
147
+ */
148
+ async respondToWellnessBreak(params) {
149
+ const {
150
+ action
151
+ } = params;
152
+ if (![_types.WELLNESS_BREAK_USER_ACTIONS.ACCEPTED, _types.WELLNESS_BREAK_USER_ACTIONS.REJECTED, _types.WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE].includes(action)) {
153
+ const {
154
+ error
155
+ } = (0, _Utils.getErrorDetails)(this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'), _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK, _constants2.CC_FILE);
156
+ throw error;
157
+ }
158
+ return this.sendWellnessBreakAction(action, _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK);
159
+ }
29
160
  getBaseUrl() {
30
161
  const wccApiGatewayUrl = this.webex.internal.services.get(_constants3.WCC_API_GATEWAY) || '';
31
162
  if (!wccApiGatewayUrl) {
32
163
  const {
33
164
  error: detailedError
34
- } = (0, _Utils.getErrorDetails)(new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
165
+ } = (0, _Utils.getErrorDetails)(new Error(_constants2.AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
35
166
  throw detailedError;
36
167
  }
37
168
  let hostname = '';
@@ -44,11 +175,78 @@ class ApiAIAssistant {
44
175
  if (!resolvedEnv) {
45
176
  const {
46
177
  error: detailedError
47
- } = (0, _Utils.getErrorDetails)(new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
178
+ } = (0, _Utils.getErrorDetails)(new Error(_constants2.AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
48
179
  throw detailedError;
49
180
  }
50
181
  return _constants3.AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);
51
182
  }
183
+ static getRtdRequestKey(rtdEventType, correlationId) {
184
+ return JSON.stringify([rtdEventType, correlationId]);
185
+ }
186
+ removeRtdRequest(rtdEventType, correlationId, settle) {
187
+ const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);
188
+ const request = this.pendingRtdRequests.get(key);
189
+ if (!request) {
190
+ return undefined;
191
+ }
192
+ if (request.timeoutId) {
193
+ clearTimeout(request.timeoutId);
194
+ }
195
+ settle?.(request);
196
+ this.pendingRtdRequests.delete(key);
197
+ return request;
198
+ }
199
+
200
+ /** Sends an AI event and waits for its matching RTD response. @internal */
201
+ async requestAndWaitForRtd(options) {
202
+ const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);
203
+ let resolveResult = () => undefined;
204
+ let rejectResult = () => undefined;
205
+ const result = new Promise((resolve, reject) => {
206
+ resolveResult = resolve;
207
+ rejectResult = reject;
208
+ });
209
+ const previousRequest = this.pendingRtdRequests.get(key);
210
+ if (previousRequest?.timeoutId) {
211
+ clearTimeout(previousRequest.timeoutId);
212
+ }
213
+ const request = {
214
+ correlationId: options.correlationId,
215
+ rtdEventType: options.rtdEventType,
216
+ resolve: resolveResult,
217
+ reject: rejectResult
218
+ };
219
+ request.timeoutId = setTimeout(() => {
220
+ this.removeRtdRequest(options.rtdEventType, options.correlationId, currentRequest => {
221
+ currentRequest.reject(options.createTimeoutError());
222
+ });
223
+ }, options.timeoutMs);
224
+ this.pendingRtdRequests.set(key, request);
225
+ const publishTimestamp = options.publishTimestamp ?? Date.now();
226
+ const acknowledgement = Promise.resolve().then(() => this.sendEvent(options.agentId, options.interactionId, options.eventType, options.eventName, options.eventMetaData, undefined, undefined, publishTimestamp, options.timeout)).catch(error => {
227
+ this.removeRtdRequest(options.rtdEventType, options.correlationId);
228
+ throw error;
229
+ });
230
+ const [payload] = await Promise.all([result, acknowledgement]);
231
+ return payload;
232
+ }
233
+
234
+ /** Resolves a pending request from a parsed RTD event. @internal */
235
+ resolveFromRtdEvent(rtdEventType, correlationId, payload) {
236
+ const request = this.removeRtdRequest(rtdEventType, correlationId, currentRequest => {
237
+ currentRequest.resolve(payload);
238
+ });
239
+ return request ? 'resolved' : 'not-found';
240
+ }
241
+
242
+ /** Clears pending RTD requests when the RTD lifecycle ends. @internal */
243
+ clearAllRtdRequests() {
244
+ Array.from(this.pendingRtdRequests.values()).forEach(request => {
245
+ this.removeRtdRequest(request.rtdEventType, request.correlationId, currentRequest => {
246
+ currentRequest.reject(new Error('RTD request cleared'));
247
+ });
248
+ });
249
+ }
52
250
 
53
251
  /**
54
252
  * Sends an event to the AI Assistant service.
@@ -56,9 +254,11 @@ class ApiAIAssistant {
56
254
  * @param interactionId - interaction/conversation identifier
57
255
  * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
58
256
  * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
59
- * @param action - action within eventDetails (e.g. 'START' or 'STOP')
257
+ * @param eventMetaData - event-specific fields to include in eventDetails.data
258
+ * @param languageCode - language code within eventDetails.data
259
+ * @param trackingId - tracking identifier within eventDetails.data
60
260
  */
61
- async sendEvent(agentId, interactionId, eventType, eventName, action) {
261
+ async sendEvent(agentId, interactionId, eventType, eventName, eventMetaData, languageCode, trackingId, publishTimestamp, timeout) {
62
262
  _loggerProxy.default.info('Sending event', {
63
263
  module: _constants2.CC_FILE,
64
264
  method: _constants2.METHODS.SEND_EVENT,
@@ -66,28 +266,37 @@ class ApiAIAssistant {
66
266
  data: {
67
267
  eventType,
68
268
  eventName,
69
- action
269
+ eventMetaData
70
270
  }
71
271
  });
72
272
  this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED]);
73
273
  try {
74
274
  const baseUrl = this.getBaseUrl();
75
275
  const orgId = this.webex.credentials.getOrgId();
276
+ const data = {
277
+ ...eventMetaData,
278
+ interactionId,
279
+ actionTimeStamp: String(Date.now()),
280
+ languageCode,
281
+ trackingId
282
+ };
76
283
  const response = await this.webex.request({
77
284
  uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
78
285
  method: _types.HTTP_METHODS.POST,
79
286
  addAuthHeader: true,
287
+ ...(timeout !== undefined ? {
288
+ timeout
289
+ } : {}),
80
290
  body: {
81
291
  agentId,
82
292
  orgId,
83
293
  eventType,
84
294
  eventName,
295
+ ...(publishTimestamp !== undefined ? {
296
+ publishTimestamp
297
+ } : {}),
85
298
  eventDetails: {
86
- data: {
87
- interactionId,
88
- action,
89
- actionTimeStamp: String(Date.now())
90
- }
299
+ data
91
300
  }
92
301
  }
93
302
  });
@@ -96,8 +305,7 @@ class ApiAIAssistant {
96
305
  orgId,
97
306
  interactionId,
98
307
  eventType,
99
- eventName,
100
- action
308
+ eventName
101
309
  }, ['operational']);
102
310
  return response?.body || {};
103
311
  } catch (error) {
@@ -105,7 +313,6 @@ class ApiAIAssistant {
105
313
  interactionId,
106
314
  eventType,
107
315
  eventName,
108
- action,
109
316
  error: error instanceof Error ? error.message : String(error)
110
317
  }, ['operational']);
111
318
  const {
@@ -115,6 +322,148 @@ class ApiAIAssistant {
115
322
  }
116
323
  }
117
324
 
325
+ /**
326
+ * Requests real-time assistance for an interaction.
327
+ *
328
+ * @param params - Real-time assistance request parameters
329
+ * @returns HTTP response body from the AI Assistant event API
330
+ * @public
331
+ */
332
+ async getRealTimeAssistance(params) {
333
+ const {
334
+ agentId,
335
+ interactionId,
336
+ context
337
+ } = params;
338
+ const trimmedContext = context?.trim();
339
+ const languageCode = params.languageCode ?? 'en';
340
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
341
+ const eventName = trimmedContext ? _types.AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT : _types.AIAssistantEventName.GET_SUGGESTIONS;
342
+ const loggerContext = {
343
+ module: _constants2.CC_FILE,
344
+ method: _constants2.METHODS.GET_REAL_TIME_ASSISTANCE,
345
+ interactionId,
346
+ trackingId,
347
+ data: {
348
+ eventName
349
+ }
350
+ };
351
+ _loggerProxy.default.info('Requesting real-time assistance', loggerContext);
352
+ 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]);
353
+ try {
354
+ if (!this.aiFeature?.suggestedResponses?.enable) {
355
+ const {
356
+ error: detailedError
357
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
358
+ throw detailedError;
359
+ }
360
+ const orgId = this.webex.credentials.getOrgId();
361
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, eventName, trimmedContext !== undefined ? {
362
+ context: trimmedContext
363
+ } : undefined, languageCode, trackingId);
364
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, {
365
+ agentId,
366
+ orgId,
367
+ interactionId,
368
+ eventName,
369
+ trackingId,
370
+ context
371
+ }, ['operational']);
372
+ _loggerProxy.default.log('Real-time assistance request succeeded', loggerContext);
373
+ return response;
374
+ } catch (error) {
375
+ _loggerProxy.default.error('Real-time assistance request failed', {
376
+ ...loggerContext,
377
+ error
378
+ });
379
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED, {
380
+ agentId,
381
+ interactionId,
382
+ trackingId,
383
+ eventName,
384
+ error: error instanceof Error ? error.message : String(error)
385
+ }, ['operational']);
386
+ const {
387
+ error: detailedError
388
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
389
+ throw detailedError;
390
+ }
391
+ }
392
+
393
+ /**
394
+ * Sends user action feedback for a real-time assistance adaptive card.
395
+ *
396
+ * @param params - Real-time assistance user action parameters
397
+ * @returns HTTP response body from the AI Assistant event API
398
+ * @public
399
+ */
400
+ async sendRealTimeAssistanceUserAction(params) {
401
+ const {
402
+ agentId,
403
+ interactionId,
404
+ adaptiveCardId,
405
+ actionId
406
+ } = params;
407
+ const actionType = 'Action.Submit';
408
+ const languageCode = params.languageCode ?? 'en';
409
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
410
+ const loggerContext = {
411
+ module: _constants2.CC_FILE,
412
+ method: _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
413
+ interactionId,
414
+ trackingId,
415
+ data: {
416
+ actionId,
417
+ adaptiveCardId
418
+ }
419
+ };
420
+ _loggerProxy.default.info('Sending real-time assistance user action', loggerContext);
421
+ 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]);
422
+ try {
423
+ if (!this.aiFeature?.suggestedResponses?.enable) {
424
+ const {
425
+ error: detailedError
426
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
427
+ throw detailedError;
428
+ }
429
+ const orgId = this.webex.credentials.getOrgId();
430
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, _types.AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION, {
431
+ adaptiveCardId,
432
+ userAction: {
433
+ actionType,
434
+ actionId
435
+ }
436
+ }, languageCode, trackingId);
437
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, {
438
+ agentId,
439
+ orgId,
440
+ interactionId,
441
+ adaptiveCardId,
442
+ actionId,
443
+ trackingId
444
+ }, ['operational']);
445
+ _loggerProxy.default.log('Real-time assistance user action sent', loggerContext);
446
+ return response;
447
+ } catch (error) {
448
+ _loggerProxy.default.error('Real-time assistance user action failed', {
449
+ ...loggerContext,
450
+ error
451
+ });
452
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED, {
453
+ agentId,
454
+ interactionId,
455
+ adaptiveCardId,
456
+ actionId,
457
+ trackingId,
458
+ error: error instanceof Error ? error.message : String(error)
459
+ }, ['operational']);
460
+ const {
461
+ error: detailedError
462
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
463
+ throw detailedError;
464
+ }
465
+ }
466
+
118
467
  /**
119
468
  * Fetches historic transcripts for an interaction.
120
469
  * This API is allowed only when real-time transcription feature is enabled.
@@ -134,6 +483,12 @@ class ApiAIAssistant {
134
483
  } = (0, _Utils.getErrorDetails)(new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
135
484
  throw detailedError;
136
485
  }
486
+ if (!this.isValidTranscriptIdentifier(agentId) || !this.isValidTranscriptIdentifier(interactionId)) {
487
+ const {
488
+ error: detailedError
489
+ } = (0, _Utils.getErrorDetails)(new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
490
+ throw detailedError;
491
+ }
137
492
  try {
138
493
  const baseUrl = this.getBaseUrl();
139
494
  const orgId = this.webex.credentials.getOrgId();
@@ -1 +1 @@
1
- {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","constructor","webex","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","getBaseUrl","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","error","detailedError","getErrorDetails","Error","METHODS","GET_BASE_URL","CC_FILE","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","sendEvent","agentId","interactionId","eventType","eventName","action","LoggerProxy","info","module","method","SEND_EVENT","data","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","baseUrl","orgId","credentials","getOrgId","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventDetails","actionTimeStamp","String","Date","now","trackEvent","message","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","enable","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n TranscriptAction,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n public aiFeature: AIFeatureFlags;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param action - action within eventDetails (e.g. 'START' or 'STOP')\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n action: TranscriptAction\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, action},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n eventDetails: {\n data: {\n interactionId,\n action,\n actionTimeStamp: String(Date.now()),\n },\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName, action},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_uuid","require","_loggerProxy","_interopRequireDefault","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","pendingRtdRequests","Map","createWellnessError","reason","error","Error","details","type","orgId","webex","credentials","getOrgId","trackingId","data","constructor","wellnessContextProvider","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","isValidTranscriptIdentifier","value","test","sendWellnessBreakAction","action","method","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED","AI_ASSISTANT_WELLNESS_ACTION_FAILED","context","agentId","trim","agentSessionId","isWellnessBreakEnabled","baseUrl","getBaseUrl","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventType","AIAssistantEventType","CUSTOM_EVENT","eventName","AIAssistantEventName","WELLNESS_BREAK_ACTION","eventDetails","actionTimeStamp","Date","now","statusCode","trackEvent","LoggerProxy","log","module","CC_FILE","message","String","detailedError","getErrorDetails","requestWellnessBreak","WELLNESS_BREAK_USER_ACTIONS","REQUESTED","METHODS","REQUEST_WELLNESS_BREAK","respondToWellnessBreak","params","ACCEPTED","REJECTED","NO_RESPONSE","includes","RESPOND_TO_WELLNESS_BREAK","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","AI_SUMMARY_ERROR_CODES","AI_ASSISTANT_BASE_URL_NOT_AVAILABLE","GET_BASE_URL","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","getRtdRequestKey","rtdEventType","correlationId","JSON","stringify","removeRtdRequest","settle","key","undefined","timeoutId","clearTimeout","delete","requestAndWaitForRtd","options","resolveResult","rejectResult","result","Promise","resolve","reject","previousRequest","setTimeout","currentRequest","createTimeoutError","timeoutMs","set","publishTimestamp","acknowledgement","then","sendEvent","interactionId","eventMetaData","timeout","catch","payload","all","resolveFromRtdEvent","clearAllRtdRequests","Array","from","values","forEach","languageCode","info","SEND_EVENT","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","getRealTimeAssistance","trimmedContext","uuidv4","ADD_SUGGESTIONS_EXTRA_CONTEXT","GET_SUGGESTIONS","loggerContext","GET_REAL_TIME_ASSISTANCE","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED","suggestedResponses","enable","sendRealTimeAssistanceUserAction","adaptiveCardId","actionId","actionType","SEND_REAL_TIME_ASSISTANCE_USER_ACTION","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED","SUGGESTED_RESPONSES_USER_ACTION","userAction","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\nimport LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {AI_SUMMARY_ERROR_CODES, CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n RealTimeAssistanceParams,\n RealTimeAssistanceUserActionParams,\n RespondToWellnessBreakParams,\n WellnessBreakUserAction,\n WELLNESS_BREAK_USER_ACTIONS,\n GenericError,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport type {PendingRtdRequest, RtdRequestOptions} from './core/types';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\ntype WellnessBreakContextProvider = () => {\n isWellnessBreakEnabled: boolean;\n agentId?: string;\n agentSessionId?: string;\n};\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n /** @internal Current AI flags from the agent configuration. */\n public aiFeature: AIFeatureFlags;\n private pendingRtdRequests = new Map<string, PendingRtdRequest<unknown>>();\n private readonly wellnessContextProvider?: WellnessBreakContextProvider;\n\n private createWellnessError(reason: string): GenericError {\n const error = new Error(reason) as GenericError;\n error.details = {\n type: 'SDK_VALIDATION_ERROR',\n orgId: this.webex.credentials.getOrgId(),\n trackingId: '',\n data: {reason},\n };\n\n return error;\n }\n\n constructor(webex: WebexSDK, wellnessContextProvider?: WellnessBreakContextProvider) {\n this.webex = webex;\n this.wellnessContextProvider = wellnessContextProvider;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n /**\n * Validates a caller-supplied identifier (agentId/interactionId) before it is used to\n * construct a request. Accepts a non-empty alphanumeric identifier that may contain\n * hyphens or underscores.\n * @param value - the identifier to validate\n * @returns {boolean} true when the identifier is a non-empty, well-formed string\n * @private\n */\n private isValidTranscriptIdentifier(value: unknown): boolean {\n return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);\n }\n\n private async sendWellnessBreakAction(\n action: WellnessBreakUserAction,\n method: string\n ): Promise<void> {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n ]);\n\n try {\n const context = this.wellnessContextProvider?.();\n const agentId = context?.agentId?.trim();\n const agentSessionId = context?.agentSessionId?.trim();\n const orgId = this.webex.credentials.getOrgId()?.trim();\n\n if (context?.isWellnessBreakEnabled !== true) {\n throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');\n }\n if (!orgId) {\n throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');\n }\n if (!agentId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');\n }\n if (!agentSessionId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');\n }\n\n const baseUrl = this.getBaseUrl();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType: AIAssistantEventType.CUSTOM_EVENT,\n eventName: AIAssistantEventName.WELLNESS_BREAK_ACTION,\n eventDetails: {\n data: {\n action,\n agentSessionId,\n actionTimeStamp: Date.now(),\n },\n },\n },\n })) as IHttpResponse;\n\n if (response.statusCode !== 202) {\n throw this.createWellnessError(\n `WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`\n );\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n {action},\n ['operational']\n );\n LoggerProxy.log('Wellness action accepted by AI Assistant', {\n module: CC_FILE,\n method,\n data: {action},\n });\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n {\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n const {error: detailedError} = getErrorDetails(error, method, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests an Agent Wellness Break.\n * The promise resolves when the HTTP request is accepted with status 202; the later\n * approval or denial is delivered independently through a wellness notification.\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.requestWellnessBreak();\n * @public\n */\n public async requestWellnessBreak(): Promise<void> {\n return this.sendWellnessBreakAction(\n WELLNESS_BREAK_USER_ACTIONS.REQUESTED,\n METHODS.REQUEST_WELLNESS_BREAK\n );\n }\n\n /**\n * Responds to a backend-provided Agent Wellness Break offer.\n * The promise resolves when the HTTP request is accepted with status 202 and does not\n * wait for a WebSocket completion event.\n * @param params - ACCEPTED, REJECTED, or NO_RESPONSE\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.respondToWellnessBreak({\n * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n * });\n * @public\n */\n public async respondToWellnessBreak(params: RespondToWellnessBreakParams): Promise<void> {\n const {action} = params;\n if (\n ![\n WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n WELLNESS_BREAK_USER_ACTIONS.REJECTED,\n WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE,\n ].includes(action)\n ) {\n const {error} = getErrorDetails(\n this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'),\n METHODS.RESPOND_TO_WELLNESS_BREAK,\n CC_FILE\n );\n throw error;\n }\n\n return this.sendWellnessBreakAction(action, METHODS.RESPOND_TO_WELLNESS_BREAK);\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n private static getRtdRequestKey(rtdEventType: string, correlationId: string): string {\n return JSON.stringify([rtdEventType, correlationId]);\n }\n\n private removeRtdRequest<T>(\n rtdEventType: string,\n correlationId: string,\n settle?: (request: PendingRtdRequest<T>) => void\n ): PendingRtdRequest<T> | undefined {\n const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);\n const request = this.pendingRtdRequests.get(key) as PendingRtdRequest<T> | undefined;\n\n if (!request) {\n return undefined;\n }\n\n if (request.timeoutId) {\n clearTimeout(request.timeoutId);\n }\n\n settle?.(request);\n this.pendingRtdRequests.delete(key);\n\n return request;\n }\n\n /** Sends an AI event and waits for its matching RTD response. @internal */\n public async requestAndWaitForRtd<T>(options: RtdRequestOptions): Promise<T> {\n const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);\n let resolveResult: (payload: T) => void = () => undefined;\n let rejectResult: (error: Error) => void = () => undefined;\n const result = new Promise<T>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n const previousRequest = this.pendingRtdRequests.get(key);\n if (previousRequest?.timeoutId) {\n clearTimeout(previousRequest.timeoutId);\n }\n const request: PendingRtdRequest<T> = {\n correlationId: options.correlationId,\n rtdEventType: options.rtdEventType,\n resolve: resolveResult,\n reject: rejectResult,\n };\n\n request.timeoutId = setTimeout(() => {\n this.removeRtdRequest<T>(options.rtdEventType, options.correlationId, (currentRequest) => {\n currentRequest.reject(options.createTimeoutError());\n });\n }, options.timeoutMs);\n this.pendingRtdRequests.set(key, request as PendingRtdRequest<unknown>);\n const publishTimestamp = options.publishTimestamp ?? Date.now();\n const acknowledgement = Promise.resolve()\n .then(() =>\n this.sendEvent(\n options.agentId,\n options.interactionId,\n options.eventType,\n options.eventName,\n options.eventMetaData,\n undefined,\n undefined,\n publishTimestamp,\n options.timeout\n )\n )\n .catch((error) => {\n this.removeRtdRequest(options.rtdEventType, options.correlationId);\n throw error;\n });\n\n const [payload] = await Promise.all([result, acknowledgement]);\n\n return payload;\n }\n\n /** Resolves a pending request from a parsed RTD event. @internal */\n public resolveFromRtdEvent<T>(\n rtdEventType: string,\n correlationId: string,\n payload: T\n ): 'resolved' | 'not-found' {\n const request = this.removeRtdRequest<T>(rtdEventType, correlationId, (currentRequest) => {\n currentRequest.resolve(payload);\n });\n\n return request ? 'resolved' : 'not-found';\n }\n\n /** Clears pending RTD requests when the RTD lifecycle ends. @internal */\n public clearAllRtdRequests(): void {\n Array.from(this.pendingRtdRequests.values()).forEach((request) => {\n this.removeRtdRequest(request.rtdEventType, request.correlationId, (currentRequest) => {\n currentRequest.reject(new Error('RTD request cleared'));\n });\n });\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param eventMetaData - event-specific fields to include in eventDetails.data\n * @param languageCode - language code within eventDetails.data\n * @param trackingId - tracking identifier within eventDetails.data\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n eventMetaData?: Record<string, unknown>,\n languageCode?: string,\n trackingId?: string,\n publishTimestamp?: number,\n timeout?: number\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, eventMetaData},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const data = {\n ...eventMetaData,\n interactionId,\n actionTimeStamp: String(Date.now()),\n languageCode,\n trackingId,\n };\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n ...(timeout !== undefined ? {timeout} : {}),\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n ...(publishTimestamp !== undefined ? {publishTimestamp} : {}),\n eventDetails: {\n data,\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests real-time assistance for an interaction.\n *\n * @param params - Real-time assistance request parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async getRealTimeAssistance(params: RealTimeAssistanceParams) {\n const {agentId, interactionId, context} = params;\n const trimmedContext = context?.trim();\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n const eventName = trimmedContext\n ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT\n : AIAssistantEventName.GET_SUGGESTIONS;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.GET_REAL_TIME_ASSISTANCE,\n interactionId,\n trackingId,\n data: {eventName},\n };\n\n LoggerProxy.info('Requesting real-time assistance', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n eventName,\n trimmedContext !== undefined ? {context: trimmedContext} : undefined,\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n eventName,\n trackingId,\n context,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance request succeeded', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance request failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n {\n agentId,\n interactionId,\n trackingId,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Sends user action feedback for a real-time assistance adaptive card.\n *\n * @param params - Real-time assistance user action parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async sendRealTimeAssistanceUserAction(\n params: RealTimeAssistanceUserActionParams\n ): Promise<Record<string, unknown>> {\n const {agentId, interactionId, adaptiveCardId, actionId} = params;\n const actionType = 'Action.Submit';\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n interactionId,\n trackingId,\n data: {actionId, adaptiveCardId},\n };\n\n LoggerProxy.info('Sending real-time assistance user action', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION,\n {\n adaptiveCardId,\n userAction: {\n actionType,\n actionId,\n },\n },\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance user action sent', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance user action failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n {\n agentId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n if (\n !this.isValidTranscriptIdentifier(agentId) ||\n !this.isValidTranscriptIdentifier(interactionId)\n ) {\n const {error: detailedError} = getErrorDetails(\n new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":"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","ignoreList":[]}