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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/.sdd/manifest.json +887 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +62 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +52 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +382 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  19. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  20. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  21. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  22. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  23. package/ai-docs/patterns/testing-patterns.md +480 -0
  24. package/ai-docs/patterns/typescript-patterns.md +365 -0
  25. package/ai-docs/templates/README.md +102 -0
  26. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  27. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  28. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  29. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  30. package/ai-docs/templates/new-method/00-master.md +80 -0
  31. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  32. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  33. package/ai-docs/templates/new-method/03-tests.md +201 -0
  34. package/ai-docs/templates/new-method/04-validation.md +141 -0
  35. package/ai-docs/templates/new-service/00-master.md +109 -0
  36. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  37. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  38. package/ai-docs/templates/new-service/03-integration.md +178 -0
  39. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  40. package/ai-docs/templates/new-service/05-validation.md +145 -0
  41. package/dist/cc.js +1010 -47
  42. package/dist/cc.js.map +1 -1
  43. package/dist/config.js +13 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.js +40 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +54 -17
  48. package/dist/index.js.map +1 -1
  49. package/dist/metrics/MetricsManager.js +16 -0
  50. package/dist/metrics/MetricsManager.js.map +1 -1
  51. package/dist/metrics/behavioral-events.js +211 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +58 -4
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/services/AddressBook.js +18 -15
  56. package/dist/services/AddressBook.js.map +1 -1
  57. package/dist/services/AnswerCallOnWebexService.js +202 -0
  58. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  59. package/dist/services/ApiAiAssistant.js +351 -14
  60. package/dist/services/ApiAiAssistant.js.map +1 -1
  61. package/dist/services/EntryPoint.js +46 -68
  62. package/dist/services/EntryPoint.js.map +1 -1
  63. package/dist/services/Queue.js +27 -22
  64. package/dist/services/Queue.js.map +1 -1
  65. package/dist/services/UserPreference.js +427 -0
  66. package/dist/services/UserPreference.js.map +1 -0
  67. package/dist/services/WebexCrossClientService.js +225 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +111 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +48 -48
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +56 -78
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +100 -226
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +97 -24
  78. package/dist/services/config/types.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +111 -32
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +28 -14
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/types.js.map +1 -1
  90. package/dist/services/index.js +1 -1
  91. package/dist/services/index.js.map +1 -1
  92. package/dist/services/task/Task.js +955 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +50 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1272 -523
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +221 -27
  99. package/dist/services/task/TaskUtils.js.map +1 -1
  100. package/dist/services/task/WebexCallingUtils.js +70 -0
  101. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  102. package/dist/services/task/constants.js +21 -2
  103. package/dist/services/task/constants.js.map +1 -1
  104. package/dist/services/task/contact.js +29 -0
  105. package/dist/services/task/contact.js.map +1 -1
  106. package/dist/services/task/dialer.js +78 -0
  107. package/dist/services/task/dialer.js.map +1 -1
  108. package/dist/services/task/digital/Digital.js +78 -0
  109. package/dist/services/task/digital/Digital.js.map +1 -0
  110. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  111. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  112. package/dist/services/task/state-machine/actions.js +572 -0
  113. package/dist/services/task/state-machine/actions.js.map +1 -0
  114. package/dist/services/task/state-machine/constants.js +161 -0
  115. package/dist/services/task/state-machine/constants.js.map +1 -0
  116. package/dist/services/task/state-machine/guards.js +379 -0
  117. package/dist/services/task/state-machine/guards.js.map +1 -0
  118. package/dist/services/task/state-machine/index.js +53 -0
  119. package/dist/services/task/state-machine/index.js.map +1 -0
  120. package/dist/services/task/state-machine/types.js +54 -0
  121. package/dist/services/task/state-machine/types.js.map +1 -0
  122. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  123. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  124. package/dist/services/task/taskDataNormalizer.js +99 -0
  125. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  126. package/dist/services/task/types.js +259 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1504 -0
  129. package/dist/services/task/voice/Voice.js.map +1 -0
  130. package/dist/services/task/voice/WebRTC.js +152 -0
  131. package/dist/services/task/voice/WebRTC.js.map +1 -0
  132. package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
  133. package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
  134. package/dist/services/task/voice/wxAppVoiceMethods.js +395 -0
  135. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  136. package/dist/services/wxAppDiagnosticLogging.js +159 -0
  137. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  138. package/dist/services/wxAppTelephonyUtils.js +19 -0
  139. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  140. package/dist/types/cc.d.ts +196 -9
  141. package/dist/types/config.d.ts +13 -0
  142. package/dist/types/constants.d.ts +38 -1
  143. package/dist/types/index.d.ts +54 -20
  144. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  145. package/dist/types/metrics/constants.d.ts +52 -1
  146. package/dist/types/services/AddressBook.d.ts +2 -1
  147. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  148. package/dist/types/services/ApiAiAssistant.d.ts +58 -5
  149. package/dist/types/services/EntryPoint.d.ts +7 -5
  150. package/dist/types/services/Queue.d.ts +5 -3
  151. package/dist/types/services/UserPreference.d.ts +118 -0
  152. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  153. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  154. package/dist/types/services/config/Util.d.ts +4 -8
  155. package/dist/types/services/config/constants.d.ts +49 -76
  156. package/dist/types/services/config/index.d.ts +16 -64
  157. package/dist/types/services/config/types.d.ts +248 -114
  158. package/dist/types/services/core/Err.d.ts +6 -0
  159. package/dist/types/services/core/Utils.d.ts +35 -13
  160. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  161. package/dist/types/services/core/types.d.ts +2 -0
  162. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  163. package/dist/types/services/core/websocket/types.d.ts +1 -1
  164. package/dist/types/services/index.d.ts +1 -1
  165. package/dist/types/services/task/Task.d.ts +186 -0
  166. package/dist/types/services/task/TaskFactory.d.ts +14 -0
  167. package/dist/types/services/task/TaskUtils.d.ts +54 -2
  168. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  169. package/dist/types/services/task/constants.d.ts +19 -0
  170. package/dist/types/services/task/contact.d.ts +4 -0
  171. package/dist/types/services/task/dialer.d.ts +30 -0
  172. package/dist/types/services/task/digital/Digital.d.ts +23 -0
  173. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  174. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  175. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  176. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  177. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  178. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  179. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  180. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  181. package/dist/types/services/task/types.d.ts +790 -66
  182. package/dist/types/services/task/voice/Voice.d.ts +241 -0
  183. package/dist/types/services/task/voice/WebRTC.d.ts +54 -0
  184. package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
  185. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +68 -0
  186. package/dist/types/services/wxAppDiagnosticLogging.d.ts +63 -0
  187. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  188. package/dist/types/types.d.ts +213 -11
  189. package/dist/types/utils/PageCache.d.ts +20 -3
  190. package/dist/types/webex.d.ts +1 -0
  191. package/dist/types.js +168 -6
  192. package/dist/types.js.map +1 -1
  193. package/dist/utils/PageCache.js +19 -5
  194. package/dist/utils/PageCache.js.map +1 -1
  195. package/dist/webex.js +22 -2
  196. package/dist/webex.js.map +1 -1
  197. package/package.json +16 -12
  198. package/src/cc.ts +1338 -121
  199. package/src/config.ts +13 -0
  200. package/src/constants.ts +41 -1
  201. package/src/index.ts +62 -15
  202. package/src/metrics/MetricsManager.ts +16 -0
  203. package/src/metrics/ai-docs/AGENTS.md +350 -0
  204. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  205. package/src/metrics/ai-docs/metrics-spec.md +971 -0
  206. package/src/metrics/behavioral-events.ts +218 -0
  207. package/src/metrics/constants.ts +63 -4
  208. package/src/services/AddressBook.ts +17 -6
  209. package/src/services/AnswerCallOnWebexService.ts +239 -0
  210. package/src/services/ApiAiAssistant.ts +470 -15
  211. package/src/services/EntryPoint.ts +59 -60
  212. package/src/services/Queue.ts +29 -12
  213. package/src/services/UserPreference.ts +509 -0
  214. package/src/services/WebexCrossClientService.ts +298 -0
  215. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  216. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  217. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  218. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  219. package/src/services/ai-docs/AGENTS.md +386 -0
  220. package/src/services/ai-docs/services-spec.md +505 -0
  221. package/src/services/config/Util.ts +54 -84
  222. package/src/services/config/ai-docs/AGENTS.md +250 -0
  223. package/src/services/config/ai-docs/ARCHITECTURE.md +413 -0
  224. package/src/services/config/ai-docs/config-spec.md +669 -0
  225. package/src/services/config/constants.ts +63 -85
  226. package/src/services/config/index.ts +116 -277
  227. package/src/services/config/types.ts +233 -125
  228. package/src/services/core/Err.ts +3 -0
  229. package/src/services/core/Utils.ts +127 -37
  230. package/src/services/core/WebexRequest.ts +3 -1
  231. package/src/services/core/ai-docs/AGENTS.md +381 -0
  232. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  233. package/src/services/core/ai-docs/core-spec.md +787 -0
  234. package/src/services/core/aqm-reqs.ts +30 -15
  235. package/src/services/core/types.ts +33 -1
  236. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  237. package/src/services/core/websocket/types.ts +1 -1
  238. package/src/services/index.ts +1 -1
  239. package/src/services/task/Task.ts +1211 -0
  240. package/src/services/task/TaskFactory.ts +82 -0
  241. package/src/services/task/TaskManager.ts +1584 -643
  242. package/src/services/task/TaskUtils.ts +316 -25
  243. package/src/services/task/WebexCallingUtils.ts +136 -0
  244. package/src/services/task/ai-docs/AGENTS.md +457 -0
  245. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  246. package/src/services/task/ai-docs/task-spec.md +1501 -0
  247. package/src/services/task/constants.ts +20 -0
  248. package/src/services/task/contact.ts +30 -0
  249. package/src/services/task/dialer.ts +80 -0
  250. package/src/services/task/digital/Digital.ts +102 -0
  251. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  252. package/src/services/task/state-machine/actions.ts +741 -0
  253. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  254. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  255. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  256. package/src/services/task/state-machine/constants.ts +172 -0
  257. package/src/services/task/state-machine/guards.ts +442 -0
  258. package/src/services/task/state-machine/index.ts +28 -0
  259. package/src/services/task/state-machine/types.ts +258 -0
  260. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  261. package/src/services/task/taskDataNormalizer.ts +137 -0
  262. package/src/services/task/types.ts +974 -70
  263. package/src/services/task/voice/Voice.ts +1878 -0
  264. package/src/services/task/voice/WebRTC.ts +194 -0
  265. package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
  266. package/src/services/task/voice/wxAppVoiceMethods.ts +575 -0
  267. package/src/services/wxAppDiagnosticLogging.ts +286 -0
  268. package/src/services/wxAppTelephonyUtils.ts +14 -0
  269. package/src/types.ts +272 -13
  270. package/src/utils/AGENTS.md +289 -0
  271. package/src/utils/PageCache.ts +38 -5
  272. package/src/utils/ai-docs/utils-spec.md +391 -0
  273. package/src/webex.js +10 -0
  274. package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
  275. package/test/unit/spec/cc.ts +3705 -150
  276. package/test/unit/spec/index.ts +885 -0
  277. package/test/unit/spec/logger-proxy.ts +70 -0
  278. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  279. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  280. package/test/unit/spec/services/AddressBook.ts +37 -6
  281. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  282. package/test/unit/spec/services/ApiAiAssistant.ts +429 -23
  283. package/test/unit/spec/services/EntryPoint.ts +87 -40
  284. package/test/unit/spec/services/Queue.ts +123 -12
  285. package/test/unit/spec/services/UserPreference.ts +401 -0
  286. package/test/unit/spec/services/WebCallingService.ts +7 -1
  287. package/test/unit/spec/services/WebexCrossClientService.ts +509 -0
  288. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  289. package/test/unit/spec/services/config/Util.ts +501 -0
  290. package/test/unit/spec/services/config/index.ts +317 -547
  291. package/test/unit/spec/services/core/Utils.ts +425 -8
  292. package/test/unit/spec/services/core/WebexRequest.ts +8 -7
  293. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  294. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  295. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  296. package/test/unit/spec/services/task/Task.ts +2723 -0
  297. package/test/unit/spec/services/task/TaskFactory.ts +116 -0
  298. package/test/unit/spec/services/task/TaskManager.ts +4781 -1585
  299. package/test/unit/spec/services/task/TaskUtils.ts +307 -0
  300. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  301. package/test/unit/spec/services/task/contact.ts +33 -0
  302. package/test/unit/spec/services/task/dialer.ts +190 -0
  303. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  304. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  305. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  306. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  307. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  308. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  309. package/test/unit/spec/services/task/voice/Voice.ts +2355 -0
  310. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  311. package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
  312. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +719 -0
  313. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +179 -0
  314. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  315. package/typedoc.md +1 -1
  316. package/umd/contact-center.min.js +2 -2
  317. package/umd/contact-center.min.js.map +1 -1
  318. package/dist/services/task/index.js +0 -1530
  319. package/dist/services/task/index.js.map +0 -1
  320. package/dist/types/services/task/index.d.ts +0 -650
  321. package/src/services/task/index.ts +0 -1806
  322. package/test/unit/spec/services/task/index.ts +0 -2205
@@ -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,114 @@ class ApiAIAssistant {
26
43
  setAIFeatureFlags(aiFeature) {
27
44
  this.aiFeature = aiFeature;
28
45
  }
46
+ async sendWellnessBreakAction(action, method) {
47
+ this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
48
+ try {
49
+ const context = this.wellnessContextProvider?.();
50
+ const agentId = context?.agentId?.trim();
51
+ const agentSessionId = context?.agentSessionId?.trim();
52
+ const orgId = this.webex.credentials.getOrgId()?.trim();
53
+ if (context?.isWellnessBreakEnabled !== true) {
54
+ throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');
55
+ }
56
+ if (!orgId) {
57
+ throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');
58
+ }
59
+ if (!agentId) {
60
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');
61
+ }
62
+ if (!agentSessionId) {
63
+ throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');
64
+ }
65
+ const baseUrl = this.getBaseUrl();
66
+ const response = await this.webex.request({
67
+ uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
68
+ method: _types.HTTP_METHODS.POST,
69
+ addAuthHeader: true,
70
+ body: {
71
+ agentId,
72
+ orgId,
73
+ eventType: _types.AIAssistantEventType.CUSTOM_EVENT,
74
+ eventName: _types.AIAssistantEventName.WELLNESS_BREAK_ACTION,
75
+ eventDetails: {
76
+ data: {
77
+ action,
78
+ agentSessionId,
79
+ actionTimeStamp: Date.now()
80
+ }
81
+ }
82
+ }
83
+ });
84
+ if (response.statusCode !== 202) {
85
+ throw this.createWellnessError(`WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`);
86
+ }
87
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, {
88
+ action
89
+ }, ['operational']);
90
+ _loggerProxy.default.log('Wellness action accepted by AI Assistant', {
91
+ module: _constants2.CC_FILE,
92
+ method,
93
+ data: {
94
+ action
95
+ }
96
+ });
97
+ } catch (error) {
98
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED, {
99
+ action,
100
+ error: error instanceof Error ? error.message : String(error)
101
+ }, ['operational']);
102
+ const {
103
+ error: detailedError
104
+ } = (0, _Utils.getErrorDetails)(error, method, _constants2.CC_FILE);
105
+ throw detailedError;
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Requests an Agent Wellness Break.
111
+ * The promise resolves when the HTTP request is accepted with status 202; the later
112
+ * approval or denial is delivered independently through a wellness notification.
113
+ * @returns A promise that resolves with no value after HTTP acceptance
114
+ * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
115
+ * @example
116
+ * await webex.cc.apiAIAssistant.requestWellnessBreak();
117
+ * @public
118
+ */
119
+ async requestWellnessBreak() {
120
+ return this.sendWellnessBreakAction(_types.WELLNESS_BREAK_USER_ACTIONS.REQUESTED, _constants2.METHODS.REQUEST_WELLNESS_BREAK);
121
+ }
122
+
123
+ /**
124
+ * Responds to a backend-provided Agent Wellness Break offer.
125
+ * The promise resolves when the HTTP request is accepted with status 202 and does not
126
+ * wait for a WebSocket completion event.
127
+ * @param params - ACCEPTED, REJECTED, or NO_RESPONSE
128
+ * @returns A promise that resolves with no value after HTTP acceptance
129
+ * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
130
+ * @example
131
+ * await webex.cc.apiAIAssistant.respondToWellnessBreak({
132
+ * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,
133
+ * });
134
+ * @public
135
+ */
136
+ async respondToWellnessBreak(params) {
137
+ const {
138
+ action
139
+ } = params;
140
+ if (![_types.WELLNESS_BREAK_USER_ACTIONS.ACCEPTED, _types.WELLNESS_BREAK_USER_ACTIONS.REJECTED, _types.WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE].includes(action)) {
141
+ const {
142
+ error
143
+ } = (0, _Utils.getErrorDetails)(this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'), _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK, _constants2.CC_FILE);
144
+ throw error;
145
+ }
146
+ return this.sendWellnessBreakAction(action, _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK);
147
+ }
29
148
  getBaseUrl() {
30
149
  const wccApiGatewayUrl = this.webex.internal.services.get(_constants3.WCC_API_GATEWAY) || '';
31
150
  if (!wccApiGatewayUrl) {
32
151
  const {
33
152
  error: detailedError
34
- } = (0, _Utils.getErrorDetails)(new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
153
+ } = (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
154
  throw detailedError;
36
155
  }
37
156
  let hostname = '';
@@ -44,11 +163,78 @@ class ApiAIAssistant {
44
163
  if (!resolvedEnv) {
45
164
  const {
46
165
  error: detailedError
47
- } = (0, _Utils.getErrorDetails)(new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
166
+ } = (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
167
  throw detailedError;
49
168
  }
50
169
  return _constants3.AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);
51
170
  }
171
+ static getRtdRequestKey(rtdEventType, correlationId) {
172
+ return JSON.stringify([rtdEventType, correlationId]);
173
+ }
174
+ removeRtdRequest(rtdEventType, correlationId, settle) {
175
+ const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);
176
+ const request = this.pendingRtdRequests.get(key);
177
+ if (!request) {
178
+ return undefined;
179
+ }
180
+ if (request.timeoutId) {
181
+ clearTimeout(request.timeoutId);
182
+ }
183
+ settle?.(request);
184
+ this.pendingRtdRequests.delete(key);
185
+ return request;
186
+ }
187
+
188
+ /** Sends an AI event and waits for its matching RTD response. @internal */
189
+ async requestAndWaitForRtd(options) {
190
+ const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);
191
+ let resolveResult = () => undefined;
192
+ let rejectResult = () => undefined;
193
+ const result = new Promise((resolve, reject) => {
194
+ resolveResult = resolve;
195
+ rejectResult = reject;
196
+ });
197
+ const previousRequest = this.pendingRtdRequests.get(key);
198
+ if (previousRequest?.timeoutId) {
199
+ clearTimeout(previousRequest.timeoutId);
200
+ }
201
+ const request = {
202
+ correlationId: options.correlationId,
203
+ rtdEventType: options.rtdEventType,
204
+ resolve: resolveResult,
205
+ reject: rejectResult
206
+ };
207
+ request.timeoutId = setTimeout(() => {
208
+ this.removeRtdRequest(options.rtdEventType, options.correlationId, currentRequest => {
209
+ currentRequest.reject(options.createTimeoutError());
210
+ });
211
+ }, options.timeoutMs);
212
+ this.pendingRtdRequests.set(key, request);
213
+ const publishTimestamp = options.publishTimestamp ?? Date.now();
214
+ const acknowledgement = Promise.resolve().then(() => this.sendEvent(options.agentId, options.interactionId, options.eventType, options.eventName, options.eventMetaData, undefined, undefined, publishTimestamp, options.timeout)).catch(error => {
215
+ this.removeRtdRequest(options.rtdEventType, options.correlationId);
216
+ throw error;
217
+ });
218
+ const [payload] = await Promise.all([result, acknowledgement]);
219
+ return payload;
220
+ }
221
+
222
+ /** Resolves a pending request from a parsed RTD event. @internal */
223
+ resolveFromRtdEvent(rtdEventType, correlationId, payload) {
224
+ const request = this.removeRtdRequest(rtdEventType, correlationId, currentRequest => {
225
+ currentRequest.resolve(payload);
226
+ });
227
+ return request ? 'resolved' : 'not-found';
228
+ }
229
+
230
+ /** Clears pending RTD requests when the RTD lifecycle ends. @internal */
231
+ clearAllRtdRequests() {
232
+ Array.from(this.pendingRtdRequests.values()).forEach(request => {
233
+ this.removeRtdRequest(request.rtdEventType, request.correlationId, currentRequest => {
234
+ currentRequest.reject(new Error('RTD request cleared'));
235
+ });
236
+ });
237
+ }
52
238
 
53
239
  /**
54
240
  * Sends an event to the AI Assistant service.
@@ -56,9 +242,11 @@ class ApiAIAssistant {
56
242
  * @param interactionId - interaction/conversation identifier
57
243
  * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
58
244
  * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
59
- * @param action - action within eventDetails (e.g. 'START' or 'STOP')
245
+ * @param eventMetaData - event-specific fields to include in eventDetails.data
246
+ * @param languageCode - language code within eventDetails.data
247
+ * @param trackingId - tracking identifier within eventDetails.data
60
248
  */
61
- async sendEvent(agentId, interactionId, eventType, eventName, action) {
249
+ async sendEvent(agentId, interactionId, eventType, eventName, eventMetaData, languageCode, trackingId, publishTimestamp, timeout) {
62
250
  _loggerProxy.default.info('Sending event', {
63
251
  module: _constants2.CC_FILE,
64
252
  method: _constants2.METHODS.SEND_EVENT,
@@ -66,28 +254,37 @@ class ApiAIAssistant {
66
254
  data: {
67
255
  eventType,
68
256
  eventName,
69
- action
257
+ eventMetaData
70
258
  }
71
259
  });
72
260
  this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED]);
73
261
  try {
74
262
  const baseUrl = this.getBaseUrl();
75
263
  const orgId = this.webex.credentials.getOrgId();
264
+ const data = {
265
+ ...eventMetaData,
266
+ interactionId,
267
+ actionTimeStamp: String(Date.now()),
268
+ languageCode,
269
+ trackingId
270
+ };
76
271
  const response = await this.webex.request({
77
272
  uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
78
273
  method: _types.HTTP_METHODS.POST,
79
274
  addAuthHeader: true,
275
+ ...(timeout !== undefined ? {
276
+ timeout
277
+ } : {}),
80
278
  body: {
81
279
  agentId,
82
280
  orgId,
83
281
  eventType,
84
282
  eventName,
283
+ ...(publishTimestamp !== undefined ? {
284
+ publishTimestamp
285
+ } : {}),
85
286
  eventDetails: {
86
- data: {
87
- interactionId,
88
- action,
89
- actionTimeStamp: String(Date.now())
90
- }
287
+ data
91
288
  }
92
289
  }
93
290
  });
@@ -96,8 +293,7 @@ class ApiAIAssistant {
96
293
  orgId,
97
294
  interactionId,
98
295
  eventType,
99
- eventName,
100
- action
296
+ eventName
101
297
  }, ['operational']);
102
298
  return response?.body || {};
103
299
  } catch (error) {
@@ -105,7 +301,6 @@ class ApiAIAssistant {
105
301
  interactionId,
106
302
  eventType,
107
303
  eventName,
108
- action,
109
304
  error: error instanceof Error ? error.message : String(error)
110
305
  }, ['operational']);
111
306
  const {
@@ -115,6 +310,148 @@ class ApiAIAssistant {
115
310
  }
116
311
  }
117
312
 
313
+ /**
314
+ * Requests real-time assistance for an interaction.
315
+ *
316
+ * @param params - Real-time assistance request parameters
317
+ * @returns HTTP response body from the AI Assistant event API
318
+ * @public
319
+ */
320
+ async getRealTimeAssistance(params) {
321
+ const {
322
+ agentId,
323
+ interactionId,
324
+ context
325
+ } = params;
326
+ const trimmedContext = context?.trim();
327
+ const languageCode = params.languageCode ?? 'en';
328
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
329
+ const eventName = trimmedContext ? _types.AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT : _types.AIAssistantEventName.GET_SUGGESTIONS;
330
+ const loggerContext = {
331
+ module: _constants2.CC_FILE,
332
+ method: _constants2.METHODS.GET_REAL_TIME_ASSISTANCE,
333
+ interactionId,
334
+ trackingId,
335
+ data: {
336
+ eventName
337
+ }
338
+ };
339
+ _loggerProxy.default.info('Requesting real-time assistance', loggerContext);
340
+ 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]);
341
+ try {
342
+ if (!this.aiFeature?.suggestedResponses?.enable) {
343
+ const {
344
+ error: detailedError
345
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
346
+ throw detailedError;
347
+ }
348
+ const orgId = this.webex.credentials.getOrgId();
349
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, eventName, trimmedContext !== undefined ? {
350
+ context: trimmedContext
351
+ } : undefined, languageCode, trackingId);
352
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, {
353
+ agentId,
354
+ orgId,
355
+ interactionId,
356
+ eventName,
357
+ trackingId,
358
+ context
359
+ }, ['operational']);
360
+ _loggerProxy.default.log('Real-time assistance request succeeded', loggerContext);
361
+ return response;
362
+ } catch (error) {
363
+ _loggerProxy.default.error('Real-time assistance request failed', {
364
+ ...loggerContext,
365
+ error
366
+ });
367
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED, {
368
+ agentId,
369
+ interactionId,
370
+ trackingId,
371
+ eventName,
372
+ error: error instanceof Error ? error.message : String(error)
373
+ }, ['operational']);
374
+ const {
375
+ error: detailedError
376
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
377
+ throw detailedError;
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Sends user action feedback for a real-time assistance adaptive card.
383
+ *
384
+ * @param params - Real-time assistance user action parameters
385
+ * @returns HTTP response body from the AI Assistant event API
386
+ * @public
387
+ */
388
+ async sendRealTimeAssistanceUserAction(params) {
389
+ const {
390
+ agentId,
391
+ interactionId,
392
+ adaptiveCardId,
393
+ actionId
394
+ } = params;
395
+ const actionType = 'Action.Submit';
396
+ const languageCode = params.languageCode ?? 'en';
397
+ const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
398
+ const loggerContext = {
399
+ module: _constants2.CC_FILE,
400
+ method: _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
401
+ interactionId,
402
+ trackingId,
403
+ data: {
404
+ actionId,
405
+ adaptiveCardId
406
+ }
407
+ };
408
+ _loggerProxy.default.info('Sending real-time assistance user action', loggerContext);
409
+ 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]);
410
+ try {
411
+ if (!this.aiFeature?.suggestedResponses?.enable) {
412
+ const {
413
+ error: detailedError
414
+ } = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
415
+ throw detailedError;
416
+ }
417
+ const orgId = this.webex.credentials.getOrgId();
418
+ const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, _types.AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION, {
419
+ adaptiveCardId,
420
+ userAction: {
421
+ actionType,
422
+ actionId
423
+ }
424
+ }, languageCode, trackingId);
425
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, {
426
+ agentId,
427
+ orgId,
428
+ interactionId,
429
+ adaptiveCardId,
430
+ actionId,
431
+ trackingId
432
+ }, ['operational']);
433
+ _loggerProxy.default.log('Real-time assistance user action sent', loggerContext);
434
+ return response;
435
+ } catch (error) {
436
+ _loggerProxy.default.error('Real-time assistance user action failed', {
437
+ ...loggerContext,
438
+ error
439
+ });
440
+ this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED, {
441
+ agentId,
442
+ interactionId,
443
+ adaptiveCardId,
444
+ actionId,
445
+ trackingId,
446
+ error: error instanceof Error ? error.message : String(error)
447
+ }, ['operational']);
448
+ const {
449
+ error: detailedError
450
+ } = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
451
+ throw detailedError;
452
+ }
453
+ }
454
+
118
455
  /**
119
456
  * Fetches historic transcripts for an interaction.
120
457
  * This API is allowed only when real-time transcription feature is enabled.
@@ -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":";;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AASA,IAAAK,MAAA,GAAAL,OAAA;AACA,IAAAM,WAAA,GAAAN,OAAA;AAKqB,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGrB;AACA;AACA;AACA;AACO,MAAMG,cAAc,CAAC;EAK1BC,WAAWA,CAACC,KAAe,EAAE;IAC3B,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,cAAc,GAAGC,uBAAc,CAACC,WAAW,CAAC;MAACH;IAAK,CAAC,CAAC;EAC3D;EAEOI,iBAAiBA,CAACC,SAAyB,EAAQ;IACxD,IAAI,CAACA,SAAS,GAAGA,SAAS;EAC5B;EAEQC,UAAUA,CAAA,EAAW;IAC3B,MAAMC,gBAAgB,GAAG,IAAI,CAACP,KAAK,CAACQ,QAAQ,CAACC,QAAQ,CAACC,GAAG,CAACC,2BAAe,CAAC,IAAI,EAAE;IAEhF,IAAI,CAACJ,gBAAgB,EAAE;MACrB,MAAM;QAACK,KAAK,EAAEC;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAIC,KAAK,CAAC,qCAAqC,CAAC,EAChDC,mBAAO,CAACC,YAAY,EACpBC,mBACF,CAAC;MACD,MAAML,aAAa;IACrB;IAEA,IAAIM,QAAQ,GAAG,EAAE;IACjB,IAAI;MACFA,QAAQ,GAAG,IAAIC,GAAG,CAACb,gBAAgB,CAAC,CAACY,QAAQ,CAACE,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,OAAOT,KAAK,EAAE;MACdO,QAAQ,GAAGZ,gBAAgB,CAACc,WAAW,CAAC,CAAC;IAC3C;IAEA,MAAMC,WAAW,GAAGC,gCAAoB,CAACJ,QAAQ,CAAC;IAClD,IAAI,CAACG,WAAW,EAAE;MAChB,MAAM;QAACV,KAAK,EAAEC;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAIC,KAAK,CAAC,qCAAqC,CAAC,EAChDC,mBAAO,CAACC,YAAY,EACpBC,mBACF,CAAC;MACD,MAAML,aAAa;IACrB;IAEA,OAAOW,0CAA8B,CAACC,OAAO,CAAC,IAAI,EAAEH,WAAW,CAAC;EAClE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaI,SAASA,CACpBC,OAAe,EACfC,aAAqB,EACrBC,SAA+B,EAC/BC,SAA+B,EAC/BC,MAAwB,EACU;IAClCC,oBAAW,CAACC,IAAI,CAAC,eAAe,EAAE;MAChCC,MAAM,EAAEhB,mBAAO;MACfiB,MAAM,EAAEnB,mBAAO,CAACoB,UAAU;MAC1BR,aAAa;MACbS,IAAI,EAAE;QAACR,SAAS;QAAEC,SAAS;QAAEC;MAAM;IACrC,CAAC,CAAC;IACF,IAAI,CAAC9B,cAAc,CAACqC,SAAS,CAAC,CAC5BC,6BAAkB,CAACC,+BAA+B,EAClDD,6BAAkB,CAACE,8BAA8B,CAClD,CAAC;IAEF,IAAI;MACF,MAAMC,OAAO,GAAG,IAAI,CAACpC,UAAU,CAAC,CAAC;MACjC,MAAMqC,KAAK,GAAG,IAAI,CAAC3C,KAAK,CAAC4C,WAAW,CAACC,QAAQ,CAAC,CAAC;MAC/C,MAAMC,QAAQ,GAAI,MAAM,IAAI,CAAC9C,KAAK,CAAC+C,OAAO,CAAC;QACzCC,GAAG,EAAE,GAAGN,OAAO,GAAGO,iCAAqB,CAACC,KAAK,EAAE;QAC/Cf,MAAM,EAAEgB,mBAAY,CAACC,IAAI;QACzBC,aAAa,EAAE,IAAI;QACnBC,IAAI,EAAE;UACJ3B,OAAO;UACPgB,KAAK;UACLd,SAAS;UACTC,SAAS;UACTyB,YAAY,EAAE;YACZlB,IAAI,EAAE;cACJT,aAAa;cACbG,MAAM;cACNyB,eAAe,EAAEC,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;YACpC;UACF;QACF;MACF,CAAC,CAAmB;MAEpB,IAAI,CAAC1D,cAAc,CAAC2D,UAAU,CAC5BrB,6BAAkB,CAACC,+BAA+B,EAClD;QAACb,OAAO;QAAEgB,KAAK;QAAEf,aAAa;QAAEC,SAAS;QAAEC,SAAS;QAAEC;MAAM,CAAC,EAC7D,CAAC,aAAa,CAChB,CAAC;MAED,OAAOe,QAAQ,EAAEQ,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,OAAO1C,KAAK,EAAE;MACd,IAAI,CAACX,cAAc,CAAC2D,UAAU,CAC5BrB,6BAAkB,CAACE,8BAA8B,EACjD;QACEb,aAAa;QACbC,SAAS;QACTC,SAAS;QACTC,MAAM;QACNnB,KAAK,EAAEA,KAAK,YAAYG,KAAK,GAAGH,KAAK,CAACiD,OAAO,GAAGJ,MAAM,CAAC7C,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MAED,MAAM;QAACA,KAAK,EAAEC;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAACF,KAAK,EAAEI,mBAAO,CAACoB,UAAU,EAAElB,mBAAO,CAAC;MAClF,MAAML,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,MAAaiD,wBAAwBA,CACnCnC,OAAe,EACfC,aAAqB,EACiB;IACtCI,oBAAW,CAACC,IAAI,CAAC,+BAA+B,EAAE;MAChDC,MAAM,EAAEhB,mBAAO;MACfiB,MAAM,EAAEnB,mBAAO,CAAC+C,0BAA0B;MAC1CnC;IACF,CAAC,CAAC;IACF,IAAI,CAAC3B,cAAc,CAACqC,SAAS,CAAC,CAC5BC,6BAAkB,CAACyB,+CAA+C,EAClEzB,6BAAkB,CAAC0B,8CAA8C,CAClE,CAAC;IACF,IAAI,CAAC,IAAI,CAAC5D,SAAS,EAAE6D,mBAAmB,EAAEC,MAAM,EAAE;MAChD,MAAM;QAACvD,KAAK,EAAEC;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAIC,KAAK,CAAC,qCAAqC,CAAC,EAChDC,mBAAO,CAAC+C,0BAA0B,EAClC7C,mBACF,CAAC;MACD,MAAML,aAAa;IACrB;IAEA,IAAI;MACF,MAAM6B,OAAO,GAAG,IAAI,CAACpC,UAAU,CAAC,CAAC;MACjC,MAAMqC,KAAK,GAAG,IAAI,CAAC3C,KAAK,CAAC4C,WAAW,CAACC,QAAQ,CAAC,CAAC;MAC/C,MAAMC,QAAQ,GAAI,MAAM,IAAI,CAAC9C,KAAK,CAAC+C,OAAO,CAAC;QACzCC,GAAG,EAAE,GAAGN,OAAO,GAAGO,iCAAqB,CAACmB,gBAAgB,EAAE;QAC1DjC,MAAM,EAAEgB,mBAAY,CAACC,IAAI;QACzBC,aAAa,EAAE,IAAI;QACnBC,IAAI,EAAE;UACJ3B,OAAO;UACPgB,KAAK;UACLf;QACF;MACF,CAAC,CAAmB;MAEpB,IAAI,CAAC3B,cAAc,CAAC2D,UAAU,CAC5BrB,6BAAkB,CAACyB,+CAA+C,EAClE;QAACrC,OAAO;QAAEgB,KAAK;QAAEf;MAAa,CAAC,EAC/B,CAAC,aAAa,CAChB,CAAC;MAED,OAAOkB,QAAQ,CAACQ,IAAI;IACtB,CAAC,CAAC,OAAO1C,KAAK,EAAE;MACd,IAAI,CAACX,cAAc,CAAC2D,UAAU,CAC5BrB,6BAAkB,CAAC0B,8CAA8C,EACjE;QACErC,aAAa;QACbhB,KAAK,EAAEA,KAAK,YAAYG,KAAK,GAAGH,KAAK,CAACiD,OAAO,GAAGJ,MAAM,CAAC7C,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MACD,IAAIA,KAAK,YAAYG,KAAK,EAAE;QAC1B,MAAMH,KAAK;MACb;MACA,MAAM;QAACA,KAAK,EAAEC;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5CF,KAAK,EACLI,mBAAO,CAAC+C,0BAA0B,EAClC7C,mBACF,CAAC;MACD,MAAML,aAAa;IACrB;EACF;AACF;AAACwD,OAAA,CAAAvE,cAAA,GAAAA,cAAA;AAAA,IAAAwE,QAAA,GAAAD,OAAA,CAAAxE,OAAA,GAEcC,cAAc","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","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 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 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":[]}