@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
@@ -0,0 +1,501 @@
1
+ import {parseAgentConfigs} from '../../../../../src/services/config/Util';
2
+ import {
3
+ AgentProfile,
4
+ AuxCode,
5
+ DialPlanEntity,
6
+ OrgDesktopLoginResponse,
7
+ TeamList,
8
+ } from '../../../../../src/services/config/types';
9
+
10
+ const baseAgentProfile: AgentProfile = {
11
+ timeoutDesktopInactivityCustomEnabled: false,
12
+ timeoutDesktopInactivityMins: 10,
13
+ accessWrapUpCode: 'ALL',
14
+ accessIdleCode: 'ALL',
15
+ autoWrapUp: false,
16
+ autoWrapAfterSeconds: 30,
17
+ lastAgentRouting: false,
18
+ allowAutoWrapUpExtension: false,
19
+ outdialEnabled: true,
20
+ dialPlanEnabled: false,
21
+ agentAvailableAfterOutdial: true,
22
+ outdialEntryPointId: 'ep-1',
23
+ consultToQueue: false,
24
+ viewableStatistics: {agentStats: false},
25
+ addressBookId: 'ab-1',
26
+ outdialANIId: 'ani-1',
27
+ loginVoiceOptions: [],
28
+ agentDNValidation: 'PROVISIONED_VALUE',
29
+ accessQueue: 'SPECIFIC',
30
+ accessEntryPoint: 'NONE',
31
+ accessBuddyTeam: 'ALL',
32
+ } as AgentProfile;
33
+
34
+ const baseOrgConfig: OrgDesktopLoginResponse = {
35
+ organization: {
36
+ tenantId: 'tenant-1',
37
+ timezone: 'UTC',
38
+ },
39
+ organizationSetting: {
40
+ campaignManagerEnabled: false,
41
+ webRtcEnabled: true,
42
+ maskSensitiveData: false,
43
+ },
44
+ tenantConfiguration: {
45
+ timeoutDesktopInactivityEnabled: false,
46
+ timeoutDesktopInactivityMins: 15,
47
+ forceDefaultDn: false,
48
+ dnDefaultRegex: '',
49
+ dnOtherRegex: '',
50
+ outdialEnabled: true,
51
+ endCallEnabled: true,
52
+ endConsultEnabled: true,
53
+ callVariablesSuppressed: false,
54
+ privacyShieldVisible: false,
55
+ lostConnectionRecoveryTimeout: 120000,
56
+ },
57
+ urlMappings: {},
58
+ };
59
+
60
+ const baseProfileData = {
61
+ orgConfig: baseOrgConfig,
62
+ userData: {
63
+ ciUserId: 'agent-1',
64
+ firstName: 'Jane',
65
+ lastName: 'Agent',
66
+ email: 'jane@example.com',
67
+ agentProfileId: 'profile-1',
68
+ skillProfileId: 'skill-1',
69
+ siteId: 'site-1',
70
+ dbId: 'db-1',
71
+ deafultDialledNumber: '+15551234567',
72
+ id: 'user-1',
73
+ },
74
+ agentProfileData: baseAgentProfile,
75
+ teamData: [{id: 'team-1', name: 'Support'}] as TeamList[],
76
+ auxCodes: [] as AuxCode[],
77
+ dialPlanData: [] as DialPlanEntity[],
78
+ multimediaProfileId: 'mm-1',
79
+ };
80
+
81
+ const auxCodePool: AuxCode[] = [
82
+ {
83
+ id: 'idle-1',
84
+ name: 'Meeting',
85
+ workTypeCode: 'IDLE_CODE',
86
+ active: true,
87
+ defaultCode: false,
88
+ isSystemCode: false,
89
+ description: '',
90
+ },
91
+ {
92
+ id: 'idle-2',
93
+ name: 'Lunch',
94
+ workTypeCode: 'IDLE_CODE',
95
+ active: true,
96
+ defaultCode: false,
97
+ isSystemCode: false,
98
+ description: '',
99
+ },
100
+ {
101
+ id: 'idle-3',
102
+ name: 'Retired',
103
+ workTypeCode: 'IDLE_CODE',
104
+ active: false,
105
+ defaultCode: false,
106
+ isSystemCode: false,
107
+ description: '',
108
+ },
109
+ {
110
+ id: 'wrap-1',
111
+ name: 'Sale',
112
+ workTypeCode: 'WRAP_UP_CODE',
113
+ active: true,
114
+ defaultCode: true,
115
+ isSystemCode: false,
116
+ description: '',
117
+ },
118
+ {
119
+ id: 'wrap-2',
120
+ name: 'No Sale',
121
+ workTypeCode: 'WRAP_UP_CODE',
122
+ active: true,
123
+ defaultCode: false,
124
+ isSystemCode: false,
125
+ description: '',
126
+ },
127
+ ];
128
+
129
+ const dialPlans: DialPlanEntity[] = [
130
+ {
131
+ id: 'plan-1',
132
+ name: 'US',
133
+ regularExpression: '1[0-9]{10}',
134
+ prefix: '1',
135
+ strippedChars: '( )-',
136
+ active: true,
137
+ },
138
+ {
139
+ id: 'plan-2',
140
+ name: 'Any Format',
141
+ regularExpression: '[0-9a-zA-Z]+',
142
+ prefix: '',
143
+ strippedChars: '( )-',
144
+ active: true,
145
+ },
146
+ {
147
+ id: 'plan-3',
148
+ name: 'Retired',
149
+ regularExpression: '[0-9]+',
150
+ prefix: '',
151
+ strippedChars: '',
152
+ active: false,
153
+ },
154
+ ];
155
+
156
+ describe('parseAgentConfigs', () => {
157
+ describe('organization aggregate mapping', () => {
158
+ it('maps every org-sourced field from the aggregate sections', () => {
159
+ const profile = parseAgentConfigs({
160
+ ...baseProfileData,
161
+ orgConfig: {
162
+ ...baseOrgConfig,
163
+ organizationSetting: {
164
+ campaignManagerEnabled: true,
165
+ webRtcEnabled: true,
166
+ maskSensitiveData: true,
167
+ },
168
+ tenantConfiguration: {
169
+ ...baseOrgConfig.tenantConfiguration,
170
+ forceDefaultDn: true,
171
+ dnDefaultRegex: 'regexUS',
172
+ dnOtherRegex: 'regexOther',
173
+ privacyShieldVisible: true,
174
+ timeoutDesktopInactivityEnabled: true,
175
+ timeoutDesktopInactivityMins: 15,
176
+ },
177
+ urlMappings: {
178
+ ACQUEON_API_URL: 'https://api.example.com',
179
+ ACQUEON_CONSOLE_URL: 'https://console.example.com',
180
+ },
181
+ },
182
+ });
183
+
184
+ expect(profile.enterpriseId).toBe('tenant-1');
185
+ expect(profile.tenantTimezone).toBe('UTC');
186
+ expect(profile.isCampaignManagementEnabled).toBe(true);
187
+ expect(profile.webRtcEnabled).toBe(true);
188
+ expect(profile.maskSensitiveData).toBe(true);
189
+ expect(profile.forceDefaultDn).toBe(true);
190
+ expect(profile.regexUS).toBe('regexUS');
191
+ expect(profile.regexOther).toBe('regexOther');
192
+ expect(profile.privacyShieldVisible).toBe(true);
193
+ expect(profile.isOutboundEnabledForTenant).toBe(true);
194
+ expect(profile.isEndTaskEnabled).toBe(true);
195
+ expect(profile.isEndConsultEnabled).toBe(true);
196
+ expect(profile.lostConnectionRecoveryTimeout).toBe(120000);
197
+ expect(profile.isTimeoutDesktopInactivityEnabled).toBe(true);
198
+ expect(profile.timeoutDesktopInactivityMins).toBe(15);
199
+ expect(profile.callVariablesSuppressed).toBe(false);
200
+ expect(profile.urlMappings).toEqual({
201
+ acqueonApiUrl: 'https://api.example.com',
202
+ acqueonConsoleUrl: 'https://console.example.com',
203
+ });
204
+ });
205
+
206
+ it('no longer emits environment', () => {
207
+ expect(parseAgentConfigs(baseProfileData)).not.toHaveProperty('environment');
208
+ });
209
+
210
+ it('defaults the Acqueon URLs when urlMappings is empty or absent', () => {
211
+ const emptyUrlMappings = {acqueonApiUrl: '', acqueonConsoleUrl: ''};
212
+
213
+ expect(parseAgentConfigs(baseProfileData).urlMappings).toEqual(emptyUrlMappings);
214
+ expect(
215
+ parseAgentConfigs({
216
+ ...baseProfileData,
217
+ orgConfig: {...baseOrgConfig, urlMappings: undefined},
218
+ }).urlMappings
219
+ ).toEqual(emptyUrlMappings);
220
+ });
221
+
222
+ it('maps the MSFT and Webex configuration from org level', () => {
223
+ const profile = parseAgentConfigs({
224
+ ...baseProfileData,
225
+ orgConfig: {
226
+ ...baseOrgConfig,
227
+ microsoftConfig: {showUserDetails: true, stateSynchronization: false},
228
+ webexConfig: {showUserDetails: false, stateSynchronization: true},
229
+ },
230
+ });
231
+
232
+ expect(profile.microsoftConfig).toEqual({
233
+ showUserDetailsMS: true,
234
+ stateSynchronizationMS: false,
235
+ });
236
+ expect(profile.webexConfig).toEqual({
237
+ showUserDetailsWebex: false,
238
+ stateSynchronizationWebex: true,
239
+ });
240
+ });
241
+
242
+ it('defaults the MSFT and Webex configuration to false when the sections are absent', () => {
243
+ const profile = parseAgentConfigs(baseProfileData);
244
+
245
+ expect(profile.microsoftConfig).toEqual({
246
+ showUserDetailsMS: false,
247
+ stateSynchronizationMS: false,
248
+ });
249
+ expect(profile.webexConfig).toEqual({
250
+ showUserDetailsWebex: false,
251
+ stateSynchronizationWebex: false,
252
+ });
253
+ });
254
+
255
+ it('maps the aiFeature section through as-is', () => {
256
+ const aiFeature = {
257
+ realtimeTranscripts: {enable: true},
258
+ suggestedResponses: {enable: false},
259
+ };
260
+
261
+ expect(parseAgentConfigs({...baseProfileData, orgConfig: {...baseOrgConfig, aiFeature}})
262
+ .aiFeature).toBe(aiFeature);
263
+ });
264
+
265
+ it('leaves aiFeature undefined when the section is absent', () => {
266
+ expect(parseAgentConfigs(baseProfileData).aiFeature).toBeUndefined();
267
+ });
268
+ });
269
+
270
+ describe('user aggregate mapping', () => {
271
+ it('maps every user-sourced and agentProfile-sourced field', () => {
272
+ const profile = parseAgentConfigs(baseProfileData);
273
+
274
+ expect(profile.agentId).toBe('agent-1');
275
+ expect(profile.agentName).toBe('Jane Agent');
276
+ expect(profile.agentMailId).toBe('jane@example.com');
277
+ expect(profile.agentProfileID).toBe('profile-1');
278
+ expect(profile.defaultDn).toBe('+15551234567');
279
+ expect(profile.siteId).toBe('site-1');
280
+ expect(profile.analyserUserId).toBe('user-1');
281
+ expect(profile.agentDbId).toBe('db-1');
282
+ expect(profile.skillProfileId).toBe('skill-1');
283
+ expect(profile.multimediaProfileId).toBe('mm-1');
284
+ expect(profile.teams).toEqual(baseProfileData.teamData);
285
+ expect(profile.forceDefaultDnForAgent).toBe(true);
286
+ expect(profile.isAdhocDialingEnabled).toBe(false);
287
+ expect(profile.idleCodesAccess).toBe('ALL');
288
+ expect(profile.isOutboundEnabledForAgent).toBe(true);
289
+ expect(profile.isAgentAvailableAfterOutdial).toBe(true);
290
+ expect(profile.outDialEp).toBe('ep-1');
291
+ expect(profile.outdialANIId).toBe('ani-1');
292
+ expect(profile.addressBookId).toBe('ab-1');
293
+ expect(profile.agentPersonalStatsEnabled).toBe(false);
294
+ expect(profile.loginVoiceOptions).toEqual([]);
295
+ expect(profile.wrapUpData.wrapUpProps).toMatchObject({
296
+ autoWrapup: false,
297
+ autoWrapupInterval: 30,
298
+ lastAgentRoute: false,
299
+ wrapUpCodeAccess: 'ALL',
300
+ allowCancelAutoWrapup: false,
301
+ });
302
+ });
303
+
304
+ it('maps collaboration access flags onto Profile', () => {
305
+ const profile = parseAgentConfigs(baseProfileData);
306
+
307
+ expect(profile.allowConsultToQueue).toBe(false);
308
+ expect(profile.accessQueue).toBe('SPECIFIC');
309
+ expect(profile.accessEntryPoint).toBe('NONE');
310
+ expect(profile.accessBuddyTeam).toBe('ALL');
311
+ });
312
+
313
+ it('no longer emits autoAnswer', () => {
314
+ expect(parseAgentConfigs(baseProfileData)).not.toHaveProperty('autoAnswer');
315
+ });
316
+
317
+ it('falls back to null when the agent has no skill profile', () => {
318
+ const profile = parseAgentConfigs({
319
+ ...baseProfileData,
320
+ userData: {...baseProfileData.userData, skillProfileId: ''},
321
+ });
322
+
323
+ expect(profile.skillProfileId).toBeNull();
324
+ });
325
+
326
+ it.each([
327
+ {
328
+ name: 'the agent override when custom inactivity timeout is enabled',
329
+ customEnabled: true,
330
+ tenantEnabled: false,
331
+ expected: 10,
332
+ },
333
+ {
334
+ name: 'the tenant value when only the tenant timeout is enabled',
335
+ customEnabled: false,
336
+ tenantEnabled: true,
337
+ expected: 15,
338
+ },
339
+ {
340
+ name: 'null when neither is enabled',
341
+ customEnabled: false,
342
+ tenantEnabled: false,
343
+ expected: null,
344
+ },
345
+ ])('resolves timeoutDesktopInactivityMins to $name', ({customEnabled, tenantEnabled, expected}) => {
346
+ const profile = parseAgentConfigs({
347
+ ...baseProfileData,
348
+ orgConfig: {
349
+ ...baseOrgConfig,
350
+ tenantConfiguration: {
351
+ ...baseOrgConfig.tenantConfiguration,
352
+ timeoutDesktopInactivityEnabled: tenantEnabled,
353
+ },
354
+ },
355
+ agentProfileData: {
356
+ ...baseAgentProfile,
357
+ timeoutDesktopInactivityCustomEnabled: customEnabled,
358
+ },
359
+ });
360
+
361
+ expect(profile.timeoutDesktopInactivityMins).toBe(expected);
362
+ });
363
+
364
+ it('does not throw when the aggregate omits the inactivity minutes', () => {
365
+ const profile = parseAgentConfigs({
366
+ ...baseProfileData,
367
+ orgConfig: {
368
+ ...baseOrgConfig,
369
+ tenantConfiguration: {
370
+ ...baseOrgConfig.tenantConfiguration,
371
+ timeoutDesktopInactivityEnabled: true,
372
+ timeoutDesktopInactivityMins: undefined,
373
+ },
374
+ },
375
+ agentProfileData: {...baseAgentProfile, timeoutDesktopInactivityMins: undefined},
376
+ });
377
+
378
+ expect(profile.timeoutDesktopInactivityMins).toBeUndefined();
379
+ });
380
+ });
381
+
382
+ describe('auxiliary codes', () => {
383
+ it('splits the pool by workTypeCode and appends the synthetic Available code', () => {
384
+ const profile = parseAgentConfigs({...baseProfileData, auxCodes: auxCodePool});
385
+
386
+ expect(profile.idleCodes).toEqual([
387
+ {id: 'idle-1', name: 'Meeting', isSystem: false, isDefault: false},
388
+ {id: 'idle-2', name: 'Lunch', isSystem: false, isDefault: false},
389
+ {id: '0', name: 'Available', isSystem: false, isDefault: false},
390
+ ]);
391
+ expect(profile.wrapupCodes).toEqual([
392
+ {id: 'wrap-1', name: 'Sale', isSystem: false, isDefault: true},
393
+ {id: 'wrap-2', name: 'No Sale', isSystem: false, isDefault: false},
394
+ ]);
395
+ expect(profile.defaultWrapupCode).toBe('wrap-1');
396
+ expect(profile.wrapUpData.wrapUpProps.wrapUpReasonList).toEqual(profile.wrapupCodes);
397
+ });
398
+
399
+ it('defaults defaultWrapupCode to an empty string when no code is default', () => {
400
+ const profile = parseAgentConfigs({
401
+ ...baseProfileData,
402
+ auxCodes: auxCodePool.map((code) => ({...code, defaultCode: false})),
403
+ });
404
+
405
+ expect(profile.defaultWrapupCode).toBe('');
406
+ });
407
+
408
+ it.each(['accessIdleCode', 'accessWrapUpCode'] as const)(
409
+ 'returns the supplied pool unfiltered but still reports %s when access is SPECIFIC',
410
+ (accessField) => {
411
+ const profile = parseAgentConfigs({
412
+ ...baseProfileData,
413
+ auxCodes: auxCodePool,
414
+ agentProfileData: {...baseAgentProfile, [accessField]: 'SPECIFIC'},
415
+ });
416
+
417
+ expect(profile.idleCodes).toHaveLength(3);
418
+ expect(profile.wrapupCodes).toHaveLength(2);
419
+ expect(profile.idleCodesAccess).toBe(
420
+ accessField === 'accessIdleCode' ? 'SPECIFIC' : 'ALL'
421
+ );
422
+ expect(profile.wrapUpData.wrapUpProps.wrapUpCodeAccess).toBe(
423
+ accessField === 'accessWrapUpCode' ? 'SPECIFIC' : 'ALL'
424
+ );
425
+ }
426
+ );
427
+ });
428
+
429
+ describe('dial plan', () => {
430
+ it('builds dialPlanEntity from every active plan when dial planning is enabled', () => {
431
+ const profile = parseAgentConfigs({
432
+ ...baseProfileData,
433
+ dialPlanData: dialPlans,
434
+ agentProfileData: {...baseAgentProfile, dialPlanEnabled: true},
435
+ });
436
+
437
+ expect(profile.dialPlan).toEqual({
438
+ type: 'adhocDial',
439
+ dialPlanEntity: [
440
+ {regex: '1[0-9]{10}', prefix: '1', strippedChars: '( )-', name: 'US'},
441
+ {regex: '[0-9a-zA-Z]+', prefix: '', strippedChars: '( )-', name: 'Any Format'},
442
+ ],
443
+ });
444
+ });
445
+
446
+ it('leaves dialPlan undefined when dial planning is disabled', () => {
447
+ expect(parseAgentConfigs({...baseProfileData, dialPlanData: dialPlans}).dialPlan).toBeUndefined();
448
+ });
449
+ });
450
+
451
+ describe('wellness break', () => {
452
+ it('enables wellness only when organization config, reminders, and license are present', () => {
453
+ const profile = parseAgentConfigs({
454
+ ...baseProfileData,
455
+ orgConfig: {
456
+ ...baseOrgConfig,
457
+ organizationSetting: {...baseOrgConfig.organizationSetting, aiAssistantQuantity: 1},
458
+ aiFeature: {
459
+ agentWellbeing: {
460
+ enable: true,
461
+ wellnessBreakReminders: 'ENABLED',
462
+ },
463
+ },
464
+ },
465
+ });
466
+
467
+ expect(profile.isWellnessBreakEnabled).toBe(true);
468
+ });
469
+
470
+ it.each([
471
+ {quantity: 0, enable: true, reminders: 'ENABLED'},
472
+ {quantity: 1, enable: false, reminders: 'ENABLED'},
473
+ {quantity: 1, enable: true, reminders: 'DISABLED'},
474
+ ] as const)('disables wellness when an effective gate is missing', ({quantity, enable, reminders}) => {
475
+ const profile = parseAgentConfigs({
476
+ ...baseProfileData,
477
+ orgConfig: {
478
+ ...baseOrgConfig,
479
+ organizationSetting: {...baseOrgConfig.organizationSetting, aiAssistantQuantity: quantity},
480
+ aiFeature: {
481
+ agentWellbeing: {enable, wellnessBreakReminders: reminders},
482
+ },
483
+ },
484
+ });
485
+
486
+ expect(profile.isWellnessBreakEnabled).toBe(false);
487
+ });
488
+
489
+ it('disables wellness when the aiFeature section is absent', () => {
490
+ const profile = parseAgentConfigs({
491
+ ...baseProfileData,
492
+ orgConfig: {
493
+ ...baseOrgConfig,
494
+ organizationSetting: {...baseOrgConfig.organizationSetting, aiAssistantQuantity: 1},
495
+ },
496
+ });
497
+
498
+ expect(profile.isWellnessBreakEnabled).toBe(false);
499
+ });
500
+ });
501
+ });