@webex/contact-center 3.11.0 → 3.12.0-llmrefactor.2

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 (267) hide show
  1. package/.sdd/manifest.json +882 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +46 -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 +48 -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 +341 -0
  17. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  18. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  19. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  20. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  21. package/ai-docs/patterns/testing-patterns.md +480 -0
  22. package/ai-docs/patterns/typescript-patterns.md +365 -0
  23. package/ai-docs/templates/README.md +102 -0
  24. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  25. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  26. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  27. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  28. package/ai-docs/templates/new-method/00-master.md +80 -0
  29. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  30. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  31. package/ai-docs/templates/new-method/03-tests.md +201 -0
  32. package/ai-docs/templates/new-method/04-validation.md +141 -0
  33. package/ai-docs/templates/new-service/00-master.md +109 -0
  34. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  35. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  36. package/ai-docs/templates/new-service/03-integration.md +178 -0
  37. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  38. package/ai-docs/templates/new-service/05-validation.md +145 -0
  39. package/dist/cc.js +379 -50
  40. package/dist/cc.js.map +1 -1
  41. package/dist/config.js +6 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.js +22 -2
  44. package/dist/constants.js.map +1 -1
  45. package/dist/index.js +27 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/metrics/behavioral-events.js +114 -0
  48. package/dist/metrics/behavioral-events.js.map +1 -1
  49. package/dist/metrics/constants.js +32 -3
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/services/ApiAiAssistant.js +318 -0
  52. package/dist/services/ApiAiAssistant.js.map +1 -0
  53. package/dist/services/UserPreference.js +427 -0
  54. package/dist/services/UserPreference.js.map +1 -0
  55. package/dist/services/agent/types.js.map +1 -1
  56. package/dist/services/config/Util.js +8 -4
  57. package/dist/services/config/Util.js.map +1 -1
  58. package/dist/services/config/constants.js +35 -2
  59. package/dist/services/config/constants.js.map +1 -1
  60. package/dist/services/config/index.js +41 -2
  61. package/dist/services/config/index.js.map +1 -1
  62. package/dist/services/config/types.js +66 -8
  63. package/dist/services/config/types.js.map +1 -1
  64. package/dist/services/constants.js +27 -1
  65. package/dist/services/constants.js.map +1 -1
  66. package/dist/services/core/Err.js.map +1 -1
  67. package/dist/services/core/Utils.js +122 -25
  68. package/dist/services/core/Utils.js.map +1 -1
  69. package/dist/services/core/aqm-reqs.js +92 -17
  70. package/dist/services/core/aqm-reqs.js.map +1 -1
  71. package/dist/services/core/websocket/WebSocketManager.js +22 -6
  72. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  73. package/dist/services/core/websocket/connection-service.js +3 -1
  74. package/dist/services/core/websocket/connection-service.js.map +1 -1
  75. package/dist/services/core/websocket/types.js.map +1 -1
  76. package/dist/services/index.js +6 -0
  77. package/dist/services/index.js.map +1 -1
  78. package/dist/services/task/Task.js +688 -0
  79. package/dist/services/task/Task.js.map +1 -0
  80. package/dist/services/task/TaskFactory.js +45 -0
  81. package/dist/services/task/TaskFactory.js.map +1 -0
  82. package/dist/services/task/TaskManager.js +751 -457
  83. package/dist/services/task/TaskManager.js.map +1 -1
  84. package/dist/services/task/TaskUtils.js +220 -23
  85. package/dist/services/task/TaskUtils.js.map +1 -1
  86. package/dist/services/task/constants.js +23 -2
  87. package/dist/services/task/constants.js.map +1 -1
  88. package/dist/services/task/dialer.js +129 -0
  89. package/dist/services/task/dialer.js.map +1 -1
  90. package/dist/services/task/digital/Digital.js +77 -0
  91. package/dist/services/task/digital/Digital.js.map +1 -0
  92. package/dist/services/task/state-machine/TaskStateMachine.js +873 -0
  93. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  94. package/dist/services/task/state-machine/actions.js +567 -0
  95. package/dist/services/task/state-machine/actions.js.map +1 -0
  96. package/dist/services/task/state-machine/constants.js +161 -0
  97. package/dist/services/task/state-machine/constants.js.map +1 -0
  98. package/dist/services/task/state-machine/guards.js +382 -0
  99. package/dist/services/task/state-machine/guards.js.map +1 -0
  100. package/dist/services/task/state-machine/index.js +53 -0
  101. package/dist/services/task/state-machine/index.js.map +1 -0
  102. package/dist/services/task/state-machine/types.js +54 -0
  103. package/dist/services/task/state-machine/types.js.map +1 -0
  104. package/dist/services/task/state-machine/uiControlsComputer.js +603 -0
  105. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  106. package/dist/services/task/taskDataNormalizer.js +99 -0
  107. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  108. package/dist/services/task/types.js +227 -4
  109. package/dist/services/task/types.js.map +1 -1
  110. package/dist/services/task/voice/Voice.js +1044 -0
  111. package/dist/services/task/voice/Voice.js.map +1 -0
  112. package/dist/services/task/voice/WebRTC.js +149 -0
  113. package/dist/services/task/voice/WebRTC.js.map +1 -0
  114. package/dist/types/cc.d.ts +894 -0
  115. package/dist/types/config.d.ts +72 -0
  116. package/dist/types/constants.d.ts +66 -0
  117. package/dist/types/index.d.ts +199 -0
  118. package/dist/types/logger-proxy.d.ts +71 -0
  119. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  120. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  121. package/dist/types/metrics/constants.d.ts +181 -0
  122. package/dist/types/services/AddressBook.d.ts +74 -0
  123. package/dist/types/services/ApiAiAssistant.d.ts +49 -0
  124. package/dist/types/services/EntryPoint.d.ts +67 -0
  125. package/dist/types/services/Queue.d.ts +76 -0
  126. package/dist/types/services/UserPreference.d.ts +118 -0
  127. package/dist/types/services/WebCallingService.d.ts +1 -0
  128. package/dist/types/services/agent/index.d.ts +46 -0
  129. package/dist/types/services/agent/types.d.ts +413 -0
  130. package/dist/types/services/config/Util.d.ts +20 -0
  131. package/dist/types/services/config/constants.d.ts +270 -0
  132. package/dist/types/services/config/index.d.ts +177 -0
  133. package/dist/types/services/config/types.d.ts +1368 -0
  134. package/dist/types/services/constants.d.ts +110 -0
  135. package/dist/types/services/core/Err.d.ts +125 -0
  136. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  137. package/dist/types/services/core/Utils.d.ts +121 -0
  138. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  139. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  140. package/dist/types/services/core/constants.d.ts +99 -0
  141. package/dist/types/services/core/types.d.ts +47 -0
  142. package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
  143. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  144. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  145. package/dist/types/services/core/websocket/types.d.ts +37 -0
  146. package/dist/types/services/index.d.ts +54 -0
  147. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  148. package/dist/types/services/task/Task.d.ts +157 -0
  149. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  150. package/dist/types/services/task/TaskManager.d.ts +1 -0
  151. package/dist/types/services/task/TaskUtils.d.ts +138 -0
  152. package/dist/types/services/task/constants.d.ts +91 -0
  153. package/dist/types/services/task/contact.d.ts +69 -0
  154. package/dist/types/services/task/dialer.d.ts +73 -0
  155. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  156. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1194 -0
  157. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  158. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  159. package/dist/types/services/task/state-machine/guards.d.ts +102 -0
  160. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  161. package/dist/types/services/task/state-machine/types.d.ts +269 -0
  162. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  163. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  164. package/dist/types/services/task/types.d.ts +1856 -0
  165. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  166. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  167. package/dist/types/types.d.ts +778 -0
  168. package/dist/types/utils/PageCache.d.ts +173 -0
  169. package/dist/types/webex-config.d.ts +53 -0
  170. package/dist/types/webex.d.ts +8 -0
  171. package/dist/types.js +130 -1
  172. package/dist/types.js.map +1 -1
  173. package/dist/webex.js +14 -2
  174. package/dist/webex.js.map +1 -1
  175. package/package.json +16 -12
  176. package/src/cc.ts +477 -51
  177. package/src/config.ts +6 -0
  178. package/src/constants.ts +21 -1
  179. package/src/index.ts +24 -5
  180. package/src/metrics/ai-docs/AGENTS.md +350 -0
  181. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  182. package/src/metrics/ai-docs/metrics-spec.md +854 -0
  183. package/src/metrics/behavioral-events.ts +120 -0
  184. package/src/metrics/constants.ts +37 -3
  185. package/src/services/ApiAiAssistant.ts +412 -0
  186. package/src/services/UserPreference.ts +509 -0
  187. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  188. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  189. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  190. package/src/services/agent/types.ts +1 -1
  191. package/src/services/ai-docs/AGENTS.md +386 -0
  192. package/src/services/ai-docs/services-spec.md +492 -0
  193. package/src/services/config/Util.ts +10 -2
  194. package/src/services/config/ai-docs/AGENTS.md +255 -0
  195. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  196. package/src/services/config/ai-docs/config-spec.md +669 -0
  197. package/src/services/config/constants.ts +37 -1
  198. package/src/services/config/index.ts +45 -1
  199. package/src/services/config/types.ts +241 -11
  200. package/src/services/constants.ts +29 -0
  201. package/src/services/core/Err.ts +3 -0
  202. package/src/services/core/Utils.ts +143 -30
  203. package/src/services/core/ai-docs/AGENTS.md +381 -0
  204. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  205. package/src/services/core/ai-docs/core-spec.md +783 -0
  206. package/src/services/core/aqm-reqs.ts +100 -22
  207. package/src/services/core/websocket/WebSocketManager.ts +23 -6
  208. package/src/services/core/websocket/connection-service.ts +5 -1
  209. package/src/services/core/websocket/types.ts +1 -1
  210. package/src/services/index.ts +4 -0
  211. package/src/services/task/Task.ts +837 -0
  212. package/src/services/task/TaskFactory.ts +55 -0
  213. package/src/services/task/TaskManager.ts +793 -521
  214. package/src/services/task/TaskUtils.ts +314 -24
  215. package/src/services/task/ai-docs/AGENTS.md +457 -0
  216. package/src/services/task/ai-docs/ARCHITECTURE.md +594 -0
  217. package/src/services/task/ai-docs/task-spec.md +1319 -0
  218. package/src/services/task/constants.ts +23 -0
  219. package/src/services/task/dialer.ts +136 -1
  220. package/src/services/task/digital/Digital.ts +95 -0
  221. package/src/services/task/state-machine/TaskStateMachine.ts +1166 -0
  222. package/src/services/task/state-machine/actions.ts +738 -0
  223. package/src/services/task/state-machine/ai-docs/AGENTS.md +458 -0
  224. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1137 -0
  225. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2177 -0
  226. package/src/services/task/state-machine/constants.ts +172 -0
  227. package/src/services/task/state-machine/guards.ts +445 -0
  228. package/src/services/task/state-machine/index.ts +28 -0
  229. package/src/services/task/state-machine/types.ts +243 -0
  230. package/src/services/task/state-machine/uiControlsComputer.ts +961 -0
  231. package/src/services/task/taskDataNormalizer.ts +137 -0
  232. package/src/services/task/types.ts +734 -71
  233. package/src/services/task/voice/Voice.ts +1270 -0
  234. package/src/services/task/voice/WebRTC.ts +187 -0
  235. package/src/types.ts +205 -2
  236. package/src/utils/AGENTS.md +278 -0
  237. package/src/utils/ai-docs/utils-spec.md +381 -0
  238. package/src/webex.js +2 -0
  239. package/test/unit/spec/cc.ts +503 -43
  240. package/test/unit/spec/logger-proxy.ts +70 -0
  241. package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
  242. package/test/unit/spec/services/UserPreference.ts +401 -0
  243. package/test/unit/spec/services/WebCallingService.ts +7 -1
  244. package/test/unit/spec/services/config/index.ts +85 -29
  245. package/test/unit/spec/services/core/Utils.ts +481 -2
  246. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
  247. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  248. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  249. package/test/unit/spec/services/task/Task.ts +477 -0
  250. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  251. package/test/unit/spec/services/task/TaskManager.ts +1001 -1003
  252. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  253. package/test/unit/spec/services/task/dialer.ts +372 -96
  254. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  255. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +2651 -0
  256. package/test/unit/spec/services/task/state-machine/guards.ts +637 -0
  257. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  258. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2663 -0
  259. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  260. package/test/unit/spec/services/task/voice/Voice.ts +649 -0
  261. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  262. package/umd/contact-center.min.js +2 -2
  263. package/umd/contact-center.min.js.map +1 -1
  264. package/dist/services/task/index.js +0 -1525
  265. package/dist/services/task/index.js.map +0 -1
  266. package/src/services/task/index.ts +0 -1801
  267. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -352,6 +352,34 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
352
352
  verb: 'fail',
353
353
  },
354
354
 
355
+ // Conference Exit
356
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_EXIT_SUCCESS]: {
357
+ product,
358
+ agent: 'user',
359
+ target: 'task_conference_exit',
360
+ verb: 'complete',
361
+ },
362
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_EXIT_FAILED]: {
363
+ product,
364
+ agent: 'user',
365
+ target: 'task_conference_exit',
366
+ verb: 'fail',
367
+ },
368
+
369
+ // Switch Call
370
+ [METRIC_EVENT_NAMES.TASK_SWITCH_CALL_SUCCESS]: {
371
+ product,
372
+ agent: 'user',
373
+ target: 'task_switch_call',
374
+ verb: 'complete',
375
+ },
376
+ [METRIC_EVENT_NAMES.TASK_SWITCH_CALL_FAILED]: {
377
+ product,
378
+ agent: 'user',
379
+ target: 'task_switch_call',
380
+ verb: 'fail',
381
+ },
382
+
355
383
  // upload logs
356
384
  [METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS]: {
357
385
  product,
@@ -435,6 +463,98 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
435
463
  target: 'outdial_ani_ep_fetch',
436
464
  verb: 'fail',
437
465
  },
466
+
467
+ // Campaign Preview API Events
468
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_SUCCESS]: {
469
+ product,
470
+ agent: 'user',
471
+ target: 'campaign_preview_accept',
472
+ verb: 'complete',
473
+ },
474
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_FAILED]: {
475
+ product,
476
+ agent: 'user',
477
+ target: 'campaign_preview_accept',
478
+ verb: 'fail',
479
+ },
480
+
481
+ // Campaign Preview Skip API Events
482
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_SUCCESS]: {
483
+ product,
484
+ agent: 'user',
485
+ target: 'campaign_preview_skip',
486
+ verb: 'complete',
487
+ },
488
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_FAILED]: {
489
+ product,
490
+ agent: 'user',
491
+ target: 'campaign_preview_skip',
492
+ verb: 'fail',
493
+ },
494
+
495
+ // Campaign Preview Remove API Events
496
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_SUCCESS]: {
497
+ product,
498
+ agent: 'user',
499
+ target: 'campaign_preview_remove',
500
+ verb: 'complete',
501
+ },
502
+ [METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_FAILED]: {
503
+ product,
504
+ agent: 'user',
505
+ target: 'campaign_preview_remove',
506
+ verb: 'fail',
507
+ },
508
+
509
+ // User Preference API Events
510
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS]: {
511
+ product,
512
+ agent: 'user',
513
+ target: 'user_preference_get',
514
+ verb: 'complete',
515
+ },
516
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED]: {
517
+ product,
518
+ agent: 'user',
519
+ target: 'user_preference_get',
520
+ verb: 'fail',
521
+ },
522
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS]: {
523
+ product,
524
+ agent: 'user',
525
+ target: 'user_preference_create',
526
+ verb: 'complete',
527
+ },
528
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED]: {
529
+ product,
530
+ agent: 'user',
531
+ target: 'user_preference_create',
532
+ verb: 'fail',
533
+ },
534
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS]: {
535
+ product,
536
+ agent: 'user',
537
+ target: 'user_preference_update',
538
+ verb: 'complete',
539
+ },
540
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED]: {
541
+ product,
542
+ agent: 'user',
543
+ target: 'user_preference_update',
544
+ verb: 'fail',
545
+ },
546
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS]: {
547
+ product,
548
+ agent: 'user',
549
+ target: 'user_preference_delete',
550
+ verb: 'complete',
551
+ },
552
+ [METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED]: {
553
+ product,
554
+ agent: 'user',
555
+ target: 'user_preference_delete',
556
+ verb: 'fail',
557
+ },
438
558
  };
439
559
 
440
560
  /**
@@ -129,6 +129,10 @@ export const METRIC_EVENT_NAMES = {
129
129
  TASK_CONFERENCE_END_FAILED: 'Task Conference End Failed',
130
130
  TASK_CONFERENCE_TRANSFER_SUCCESS: 'Task Conference Transfer Success',
131
131
  TASK_CONFERENCE_TRANSFER_FAILED: 'Task Conference Transfer Failed',
132
+ TASK_CONFERENCE_EXIT_SUCCESS: 'Task Conference Exit Success',
133
+ TASK_CONFERENCE_EXIT_FAILED: 'Task Conference Exit Failed',
134
+ TASK_SWITCH_CALL_SUCCESS: 'Task Switch Call Success',
135
+ TASK_SWITCH_CALL_FAILED: 'Task Switch Call Failed',
132
136
 
133
137
  TASK_OUTDIAL_SUCCESS: 'Task Outdial Success',
134
138
  TASK_OUTDIAL_FAILED: 'Task Outdial Failed',
@@ -138,11 +142,10 @@ export const METRIC_EVENT_NAMES = {
138
142
  WEBSOCKET_DEREGISTER_SUCCESS: 'Websocket Deregister Success',
139
143
  WEBSOCKET_DEREGISTER_FAIL: 'Websocket Deregister Failed',
140
144
 
141
- // WebSocket message events
142
- WEBSOCKET_EVENT_RECEIVED: 'Websocket Event Received',
143
-
144
145
  AGENT_DEVICE_TYPE_UPDATE_SUCCESS: 'Agent Device Type Update Success',
145
146
  AGENT_DEVICE_TYPE_UPDATE_FAILED: 'Agent Device Type Update Failed',
147
+ // WebSocket message events
148
+ WEBSOCKET_EVENT_RECEIVED: 'Websocket Event Received',
146
149
 
147
150
  // EntryPoint API Events
148
151
  ENTRYPOINT_FETCH_SUCCESS: 'Entrypoint Fetch Success',
@@ -159,6 +162,37 @@ export const METRIC_EVENT_NAMES = {
159
162
  // Outdial ANI Entries API Events
160
163
  OUTDIAL_ANI_EP_FETCH_SUCCESS: 'Outdial ANI Entries Fetch Success',
161
164
  OUTDIAL_ANI_EP_FETCH_FAILED: 'Outdial ANI Entries Fetch Failed',
165
+
166
+ // Campaign Preview API Events
167
+ CAMPAIGN_PREVIEW_ACCEPT_SUCCESS: 'Campaign Preview Accept Success',
168
+ CAMPAIGN_PREVIEW_ACCEPT_FAILED: 'Campaign Preview Accept Failed',
169
+ CAMPAIGN_PREVIEW_SKIP_SUCCESS: 'Campaign Preview Skip Success',
170
+ CAMPAIGN_PREVIEW_SKIP_FAILED: 'Campaign Preview Skip Failed',
171
+ CAMPAIGN_PREVIEW_REMOVE_SUCCESS: 'Campaign Preview Remove Success',
172
+ CAMPAIGN_PREVIEW_REMOVE_FAILED: 'Campaign Preview Remove Failed',
173
+
174
+ // AI Assistant Transcript events
175
+ AI_ASSISTANT_SEND_EVENT_SUCCESS: 'AI Assistant Send Event Success',
176
+ AI_ASSISTANT_SEND_EVENT_FAILED: 'AI Assistant Send Event Failed',
177
+ AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS: 'AI Assistant Get Real Time Assistance Success',
178
+ AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED: 'AI Assistant Get Real Time Assistance Failed',
179
+ AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS:
180
+ 'AI Assistant Send Real Time Assistance User Action Success',
181
+ AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED:
182
+ 'AI Assistant Send Real Time Assistance User Action Failed',
183
+ AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS:
184
+ 'AI Assistant Fetch Historic Transcripts Success',
185
+ AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED: 'AI Assistant Fetch Historic Transcripts Failed',
186
+
187
+ // User Preference API Events
188
+ USER_PREFERENCE_GET_SUCCESS: 'User Preference Get Success',
189
+ USER_PREFERENCE_GET_FAILED: 'User Preference Get Failed',
190
+ USER_PREFERENCE_CREATE_SUCCESS: 'User Preference Create Success',
191
+ USER_PREFERENCE_CREATE_FAILED: 'User Preference Create Failed',
192
+ USER_PREFERENCE_UPDATE_SUCCESS: 'User Preference Update Success',
193
+ USER_PREFERENCE_UPDATE_FAILED: 'User Preference Update Failed',
194
+ USER_PREFERENCE_DELETE_SUCCESS: 'User Preference Delete Success',
195
+ USER_PREFERENCE_DELETE_FAILED: 'User Preference Delete Failed',
162
196
  } as const;
163
197
 
164
198
  /**
@@ -0,0 +1,412 @@
1
+ import {v4 as uuidv4} from 'uuid';
2
+ import LoggerProxy from '../logger-proxy';
3
+ import MetricsManager from '../metrics/MetricsManager';
4
+ import {METRIC_EVENT_NAMES} from '../metrics/constants';
5
+ import {CC_FILE, METHODS} from '../constants';
6
+ import {
7
+ HTTP_METHODS,
8
+ WebexSDK,
9
+ IHttpResponse,
10
+ AIAssistantEventType,
11
+ AIAssistantEventName,
12
+ HistoricTranscriptsResponse,
13
+ RealTimeAssistanceParams,
14
+ RealTimeAssistanceUserActionParams,
15
+ } from '../types';
16
+ import {getErrorDetails} from './core/Utils';
17
+ import {
18
+ AI_ASSISTANT_BASE_URL_TEMPLATE,
19
+ AI_ASSISTANT_ENV_MAP,
20
+ AI_ASSISTANT_API_URLS,
21
+ WCC_API_GATEWAY,
22
+ } from './constants';
23
+ import {AIFeatureFlags} from './config/types';
24
+
25
+ /**
26
+ * ApiAIAssistant provides AI Assistant APIs for transcript controls.
27
+ * @public
28
+ */
29
+ export class ApiAIAssistant {
30
+ private webex: WebexSDK;
31
+ private metricsManager: MetricsManager;
32
+ private aiFeature: AIFeatureFlags;
33
+
34
+ constructor(webex: WebexSDK) {
35
+ this.webex = webex;
36
+ this.metricsManager = MetricsManager.getInstance({webex});
37
+ }
38
+
39
+ public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {
40
+ this.aiFeature = aiFeature;
41
+ }
42
+
43
+ private getBaseUrl(): string {
44
+ const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';
45
+
46
+ if (!wccApiGatewayUrl) {
47
+ const {error: detailedError} = getErrorDetails(
48
+ new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),
49
+ METHODS.GET_BASE_URL,
50
+ CC_FILE
51
+ );
52
+ throw detailedError;
53
+ }
54
+
55
+ let hostname = '';
56
+ try {
57
+ hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();
58
+ } catch (error) {
59
+ hostname = wccApiGatewayUrl.toLowerCase();
60
+ }
61
+
62
+ const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];
63
+ if (!resolvedEnv) {
64
+ const {error: detailedError} = getErrorDetails(
65
+ new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),
66
+ METHODS.GET_BASE_URL,
67
+ CC_FILE
68
+ );
69
+ throw detailedError;
70
+ }
71
+
72
+ return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);
73
+ }
74
+
75
+ /**
76
+ * Sends an event to the AI Assistant service.
77
+ * @param agentId - agent identifier
78
+ * @param interactionId - interaction/conversation identifier
79
+ * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
80
+ * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
81
+ * @param eventMetaData - event-specific fields to include in eventDetails.data
82
+ * @param languageCode - language code within eventDetails.data
83
+ * @param trackingId - tracking identifier within eventDetails.data
84
+ */
85
+ public async sendEvent(
86
+ agentId: string,
87
+ interactionId: string,
88
+ eventType: AIAssistantEventType,
89
+ eventName: AIAssistantEventName,
90
+ eventMetaData?: Record<string, unknown>,
91
+ languageCode?: string,
92
+ trackingId?: string
93
+ ): Promise<Record<string, unknown>> {
94
+ LoggerProxy.info('Sending event', {
95
+ module: CC_FILE,
96
+ method: METHODS.SEND_EVENT,
97
+ interactionId,
98
+ data: {eventType, eventName, eventMetaData},
99
+ });
100
+ this.metricsManager.timeEvent([
101
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,
102
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,
103
+ ]);
104
+
105
+ try {
106
+ const baseUrl = this.getBaseUrl();
107
+ const orgId = this.webex.credentials.getOrgId();
108
+ const response = (await this.webex.request({
109
+ uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,
110
+ method: HTTP_METHODS.POST,
111
+ addAuthHeader: true,
112
+ body: {
113
+ agentId,
114
+ orgId,
115
+ eventType,
116
+ eventName,
117
+ eventDetails: {
118
+ data: {
119
+ ...eventMetaData,
120
+ interactionId,
121
+ actionTimeStamp: String(Date.now()),
122
+ languageCode,
123
+ trackingId,
124
+ },
125
+ },
126
+ },
127
+ })) as IHttpResponse;
128
+
129
+ this.metricsManager.trackEvent(
130
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,
131
+ {agentId, orgId, interactionId, eventType, eventName},
132
+ ['operational']
133
+ );
134
+
135
+ return response?.body || {};
136
+ } catch (error) {
137
+ this.metricsManager.trackEvent(
138
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,
139
+ {
140
+ interactionId,
141
+ eventType,
142
+ eventName,
143
+ error: error instanceof Error ? error.message : String(error),
144
+ },
145
+ ['operational']
146
+ );
147
+
148
+ const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);
149
+ throw detailedError;
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Requests real-time assistance for an interaction.
155
+ *
156
+ * @param params - Real-time assistance request parameters
157
+ * @returns HTTP response body from the AI Assistant event API
158
+ * @public
159
+ */
160
+ public async getRealTimeAssistance(params: RealTimeAssistanceParams) {
161
+ const {agentId, interactionId, context} = params;
162
+ const trimmedContext = context?.trim();
163
+ const languageCode = params.languageCode ?? 'en';
164
+ const trackingId = `WX_CC_SDK_${uuidv4()}`;
165
+ const eventName = trimmedContext
166
+ ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT
167
+ : AIAssistantEventName.GET_SUGGESTIONS;
168
+
169
+ const loggerContext = {
170
+ module: CC_FILE,
171
+ method: METHODS.GET_REAL_TIME_ASSISTANCE,
172
+ interactionId,
173
+ trackingId,
174
+ data: {eventName},
175
+ };
176
+
177
+ LoggerProxy.info('Requesting real-time assistance', loggerContext);
178
+
179
+ this.metricsManager.timeEvent([
180
+ METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,
181
+ METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,
182
+ ]);
183
+
184
+ try {
185
+ if (!this.aiFeature?.suggestedResponses?.enable) {
186
+ const {error: detailedError} = getErrorDetails(
187
+ new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),
188
+ METHODS.GET_REAL_TIME_ASSISTANCE,
189
+ CC_FILE
190
+ );
191
+ throw detailedError;
192
+ }
193
+
194
+ const orgId = this.webex.credentials.getOrgId();
195
+
196
+ const response = await this.sendEvent(
197
+ agentId,
198
+ interactionId,
199
+ AIAssistantEventType.CUSTOM_EVENT,
200
+ eventName,
201
+ trimmedContext !== undefined ? {context: trimmedContext} : undefined,
202
+ languageCode,
203
+ trackingId
204
+ );
205
+
206
+ this.metricsManager.trackEvent(
207
+ METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,
208
+ {
209
+ agentId,
210
+ orgId,
211
+ interactionId,
212
+ eventName,
213
+ trackingId,
214
+ context,
215
+ },
216
+ ['operational']
217
+ );
218
+ LoggerProxy.log('Real-time assistance request succeeded', loggerContext);
219
+
220
+ return response;
221
+ } catch (error) {
222
+ LoggerProxy.error('Real-time assistance request failed', {...loggerContext, error});
223
+ this.metricsManager.trackEvent(
224
+ METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,
225
+ {
226
+ agentId,
227
+ interactionId,
228
+ trackingId,
229
+ eventName,
230
+ error: error instanceof Error ? error.message : String(error),
231
+ },
232
+ ['operational']
233
+ );
234
+
235
+ const {error: detailedError} = getErrorDetails(
236
+ error,
237
+ METHODS.GET_REAL_TIME_ASSISTANCE,
238
+ CC_FILE
239
+ );
240
+ throw detailedError;
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Sends user action feedback for a real-time assistance adaptive card.
246
+ *
247
+ * @param params - Real-time assistance user action parameters
248
+ * @returns HTTP response body from the AI Assistant event API
249
+ * @public
250
+ */
251
+ public async sendRealTimeAssistanceUserAction(
252
+ params: RealTimeAssistanceUserActionParams
253
+ ): Promise<Record<string, unknown>> {
254
+ const {agentId, interactionId, adaptiveCardId, actionId} = params;
255
+ const actionType = 'Action.Submit';
256
+ const languageCode = params.languageCode ?? 'en';
257
+ const trackingId = `WX_CC_SDK_${uuidv4()}`;
258
+
259
+ const loggerContext = {
260
+ module: CC_FILE,
261
+ method: METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
262
+ interactionId,
263
+ trackingId,
264
+ data: {actionId, adaptiveCardId},
265
+ };
266
+
267
+ LoggerProxy.info('Sending real-time assistance user action', loggerContext);
268
+
269
+ this.metricsManager.timeEvent([
270
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,
271
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,
272
+ ]);
273
+
274
+ try {
275
+ if (!this.aiFeature?.suggestedResponses?.enable) {
276
+ const {error: detailedError} = getErrorDetails(
277
+ new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),
278
+ METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
279
+ CC_FILE
280
+ );
281
+ throw detailedError;
282
+ }
283
+
284
+ const orgId = this.webex.credentials.getOrgId();
285
+ const response = await this.sendEvent(
286
+ agentId,
287
+ interactionId,
288
+ AIAssistantEventType.CUSTOM_EVENT,
289
+ AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION,
290
+ {
291
+ adaptiveCardId,
292
+ userAction: {
293
+ actionType,
294
+ actionId,
295
+ },
296
+ },
297
+ languageCode,
298
+ trackingId
299
+ );
300
+
301
+ this.metricsManager.trackEvent(
302
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,
303
+ {
304
+ agentId,
305
+ orgId,
306
+ interactionId,
307
+ adaptiveCardId,
308
+ actionId,
309
+ trackingId,
310
+ },
311
+ ['operational']
312
+ );
313
+ LoggerProxy.log('Real-time assistance user action sent', loggerContext);
314
+
315
+ return response;
316
+ } catch (error) {
317
+ LoggerProxy.error('Real-time assistance user action failed', {...loggerContext, error});
318
+ this.metricsManager.trackEvent(
319
+ METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,
320
+ {
321
+ agentId,
322
+ interactionId,
323
+ adaptiveCardId,
324
+ actionId,
325
+ trackingId,
326
+ error: error instanceof Error ? error.message : String(error),
327
+ },
328
+ ['operational']
329
+ );
330
+
331
+ const {error: detailedError} = getErrorDetails(
332
+ error,
333
+ METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
334
+ CC_FILE
335
+ );
336
+ throw detailedError;
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Fetches historic transcripts for an interaction.
342
+ * This API is allowed only when real-time transcription feature is enabled.
343
+ *
344
+ * @param interactionId - interaction/conversation identifier
345
+ */
346
+ public async fetchHistoricTranscripts(
347
+ agentId: string,
348
+ interactionId: string
349
+ ): Promise<HistoricTranscriptsResponse> {
350
+ LoggerProxy.info('Fetching historic transcripts', {
351
+ module: CC_FILE,
352
+ method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,
353
+ interactionId,
354
+ });
355
+ this.metricsManager.timeEvent([
356
+ METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,
357
+ METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,
358
+ ]);
359
+ if (!this.aiFeature?.realtimeTranscripts?.enable) {
360
+ const {error: detailedError} = getErrorDetails(
361
+ new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),
362
+ METHODS.FETCH_HISTORIC_TRANSCRIPTS,
363
+ CC_FILE
364
+ );
365
+ throw detailedError;
366
+ }
367
+
368
+ try {
369
+ const baseUrl = this.getBaseUrl();
370
+ const orgId = this.webex.credentials.getOrgId();
371
+ const response = (await this.webex.request({
372
+ uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,
373
+ method: HTTP_METHODS.POST,
374
+ addAuthHeader: true,
375
+ body: {
376
+ agentId,
377
+ orgId,
378
+ interactionId,
379
+ },
380
+ })) as IHttpResponse;
381
+
382
+ this.metricsManager.trackEvent(
383
+ METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,
384
+ {agentId, orgId, interactionId},
385
+ ['operational']
386
+ );
387
+
388
+ return response.body as HistoricTranscriptsResponse;
389
+ } catch (error) {
390
+ this.metricsManager.trackEvent(
391
+ METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,
392
+ {
393
+ interactionId,
394
+ error: error instanceof Error ? error.message : String(error),
395
+ },
396
+ ['operational']
397
+ );
398
+
399
+ if (error instanceof Error) {
400
+ throw error;
401
+ }
402
+ const {error: detailedError} = getErrorDetails(
403
+ error,
404
+ METHODS.FETCH_HISTORIC_TRANSCRIPTS,
405
+ CC_FILE
406
+ );
407
+ throw detailedError;
408
+ }
409
+ }
410
+ }
411
+
412
+ export default ApiAIAssistant;