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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.sdd/manifest.json +884 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +53 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +52 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +382 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  19. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  20. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  21. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  22. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  23. package/ai-docs/patterns/testing-patterns.md +480 -0
  24. package/ai-docs/patterns/typescript-patterns.md +365 -0
  25. package/ai-docs/templates/README.md +102 -0
  26. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  27. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  28. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  29. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  30. package/ai-docs/templates/new-method/00-master.md +80 -0
  31. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  32. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  33. package/ai-docs/templates/new-method/03-tests.md +201 -0
  34. package/ai-docs/templates/new-method/04-validation.md +141 -0
  35. package/ai-docs/templates/new-service/00-master.md +109 -0
  36. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  37. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  38. package/ai-docs/templates/new-service/03-integration.md +178 -0
  39. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  40. package/ai-docs/templates/new-service/05-validation.md +145 -0
  41. package/dist/cc.js +971 -42
  42. package/dist/cc.js.map +1 -1
  43. package/dist/config.js +13 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.js +31 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +45 -15
  48. package/dist/index.js.map +1 -1
  49. package/dist/metrics/MetricsManager.js +16 -0
  50. package/dist/metrics/MetricsManager.js.map +1 -1
  51. package/dist/metrics/behavioral-events.js +205 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +48 -4
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/services/AddressBook.js +18 -15
  56. package/dist/services/AddressBook.js.map +1 -1
  57. package/dist/services/AnswerCallOnWebexService.js +202 -0
  58. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  59. package/dist/services/ApiAiAssistant.js +269 -9
  60. package/dist/services/ApiAiAssistant.js.map +1 -1
  61. package/dist/services/EntryPoint.js +46 -68
  62. package/dist/services/EntryPoint.js.map +1 -1
  63. package/dist/services/Queue.js +27 -22
  64. package/dist/services/Queue.js.map +1 -1
  65. package/dist/services/UserPreference.js +427 -0
  66. package/dist/services/UserPreference.js.map +1 -0
  67. package/dist/services/WebexCrossClientService.js +222 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +11 -4
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +41 -7
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +51 -0
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +57 -12
  78. package/dist/services/config/types.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +111 -32
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +28 -14
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/types.js.map +1 -1
  90. package/dist/services/index.js +1 -1
  91. package/dist/services/index.js.map +1 -1
  92. package/dist/services/task/Task.js +754 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +49 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1172 -521
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +211 -27
  99. package/dist/services/task/TaskUtils.js.map +1 -1
  100. package/dist/services/task/WebexCallingUtils.js +70 -0
  101. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  102. package/dist/services/task/constants.js +12 -2
  103. package/dist/services/task/constants.js.map +1 -1
  104. package/dist/services/task/contact.js +29 -0
  105. package/dist/services/task/contact.js.map +1 -1
  106. package/dist/services/task/dialer.js +78 -0
  107. package/dist/services/task/dialer.js.map +1 -1
  108. package/dist/services/task/digital/Digital.js +78 -0
  109. package/dist/services/task/digital/Digital.js.map +1 -0
  110. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  111. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  112. package/dist/services/task/state-machine/actions.js +572 -0
  113. package/dist/services/task/state-machine/actions.js.map +1 -0
  114. package/dist/services/task/state-machine/constants.js +161 -0
  115. package/dist/services/task/state-machine/constants.js.map +1 -0
  116. package/dist/services/task/state-machine/guards.js +379 -0
  117. package/dist/services/task/state-machine/guards.js.map +1 -0
  118. package/dist/services/task/state-machine/index.js +53 -0
  119. package/dist/services/task/state-machine/index.js.map +1 -0
  120. package/dist/services/task/state-machine/types.js +54 -0
  121. package/dist/services/task/state-machine/types.js.map +1 -0
  122. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  123. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  124. package/dist/services/task/taskDataNormalizer.js +99 -0
  125. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  126. package/dist/services/task/types.js +228 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1485 -0
  129. package/dist/services/task/voice/Voice.js.map +1 -0
  130. package/dist/services/task/voice/WebRTC.js +152 -0
  131. package/dist/services/task/voice/WebRTC.js.map +1 -0
  132. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  133. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  134. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  135. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  136. package/dist/services/wxAppTelephonyUtils.js +19 -0
  137. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  138. package/dist/types/cc.d.ts +193 -6
  139. package/dist/types/config.d.ts +13 -0
  140. package/dist/types/constants.d.ts +29 -1
  141. package/dist/types/index.d.ts +35 -8
  142. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  143. package/dist/types/metrics/constants.d.ts +43 -1
  144. package/dist/types/services/AddressBook.d.ts +2 -1
  145. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  146. package/dist/types/services/ApiAiAssistant.d.ts +56 -5
  147. package/dist/types/services/EntryPoint.d.ts +7 -5
  148. package/dist/types/services/Queue.d.ts +5 -3
  149. package/dist/types/services/UserPreference.d.ts +118 -0
  150. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  151. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  152. package/dist/types/services/config/constants.d.ts +34 -5
  153. package/dist/types/services/config/types.d.ts +197 -12
  154. package/dist/types/services/core/Err.d.ts +6 -0
  155. package/dist/types/services/core/Utils.d.ts +35 -13
  156. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  157. package/dist/types/services/core/types.d.ts +2 -0
  158. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  159. package/dist/types/services/core/websocket/types.d.ts +1 -1
  160. package/dist/types/services/index.d.ts +1 -1
  161. package/dist/types/services/task/Task.d.ts +175 -0
  162. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  163. package/dist/types/services/task/TaskUtils.d.ts +48 -2
  164. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  165. package/dist/types/services/task/constants.d.ts +10 -0
  166. package/dist/types/services/task/contact.d.ts +4 -0
  167. package/dist/types/services/task/dialer.d.ts +30 -0
  168. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  169. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  170. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  171. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  172. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  173. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  174. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  175. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  176. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  177. package/dist/types/services/task/types.d.ts +680 -66
  178. package/dist/types/services/task/voice/Voice.d.ts +227 -0
  179. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  180. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  181. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  182. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  183. package/dist/types/types.d.ts +205 -9
  184. package/dist/types/utils/PageCache.d.ts +20 -3
  185. package/dist/types/webex.d.ts +1 -0
  186. package/dist/types.js +162 -4
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/PageCache.js +19 -5
  189. package/dist/utils/PageCache.js.map +1 -1
  190. package/dist/webex.js +22 -2
  191. package/dist/webex.js.map +1 -1
  192. package/package.json +16 -12
  193. package/src/cc.ts +1289 -112
  194. package/src/config.ts +13 -0
  195. package/src/constants.ts +29 -1
  196. package/src/index.ts +36 -5
  197. package/src/metrics/MetricsManager.ts +16 -0
  198. package/src/metrics/ai-docs/AGENTS.md +350 -0
  199. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  200. package/src/metrics/ai-docs/metrics-spec.md +921 -0
  201. package/src/metrics/behavioral-events.ts +212 -0
  202. package/src/metrics/constants.ts +52 -4
  203. package/src/services/AddressBook.ts +17 -6
  204. package/src/services/AnswerCallOnWebexService.ts +239 -0
  205. package/src/services/ApiAiAssistant.ts +356 -9
  206. package/src/services/EntryPoint.ts +59 -60
  207. package/src/services/Queue.ts +29 -12
  208. package/src/services/UserPreference.ts +509 -0
  209. package/src/services/WebexCrossClientService.ts +293 -0
  210. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  211. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  212. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  213. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  214. package/src/services/ai-docs/AGENTS.md +386 -0
  215. package/src/services/ai-docs/services-spec.md +505 -0
  216. package/src/services/config/Util.ts +12 -3
  217. package/src/services/config/ai-docs/AGENTS.md +255 -0
  218. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  219. package/src/services/config/ai-docs/config-spec.md +686 -0
  220. package/src/services/config/constants.ts +46 -6
  221. package/src/services/config/index.ts +65 -0
  222. package/src/services/config/types.ts +197 -13
  223. package/src/services/core/Err.ts +3 -0
  224. package/src/services/core/Utils.ts +127 -37
  225. package/src/services/core/WebexRequest.ts +3 -1
  226. package/src/services/core/ai-docs/AGENTS.md +381 -0
  227. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  228. package/src/services/core/ai-docs/core-spec.md +787 -0
  229. package/src/services/core/aqm-reqs.ts +30 -15
  230. package/src/services/core/types.ts +2 -0
  231. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  232. package/src/services/core/websocket/types.ts +1 -1
  233. package/src/services/index.ts +1 -1
  234. package/src/services/task/Task.ts +908 -0
  235. package/src/services/task/TaskFactory.ts +60 -0
  236. package/src/services/task/TaskManager.ts +1419 -608
  237. package/src/services/task/TaskUtils.ts +303 -25
  238. package/src/services/task/WebexCallingUtils.ts +136 -0
  239. package/src/services/task/ai-docs/AGENTS.md +457 -0
  240. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  241. package/src/services/task/ai-docs/task-spec.md +1474 -0
  242. package/src/services/task/constants.ts +10 -0
  243. package/src/services/task/contact.ts +30 -0
  244. package/src/services/task/dialer.ts +80 -0
  245. package/src/services/task/digital/Digital.ts +97 -0
  246. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  247. package/src/services/task/state-machine/actions.ts +741 -0
  248. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  249. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  250. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  251. package/src/services/task/state-machine/constants.ts +172 -0
  252. package/src/services/task/state-machine/guards.ts +442 -0
  253. package/src/services/task/state-machine/index.ts +28 -0
  254. package/src/services/task/state-machine/types.ts +258 -0
  255. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  256. package/src/services/task/taskDataNormalizer.ts +137 -0
  257. package/src/services/task/types.ts +819 -70
  258. package/src/services/task/voice/Voice.ts +1851 -0
  259. package/src/services/task/voice/WebRTC.ts +191 -0
  260. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  261. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  262. package/src/services/wxAppTelephonyUtils.ts +14 -0
  263. package/src/types.ts +262 -11
  264. package/src/utils/AGENTS.md +289 -0
  265. package/src/utils/PageCache.ts +38 -5
  266. package/src/utils/ai-docs/utils-spec.md +391 -0
  267. package/src/webex.js +10 -0
  268. package/test/unit/spec/cc.ts +2210 -119
  269. package/test/unit/spec/logger-proxy.ts +70 -0
  270. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  271. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  272. package/test/unit/spec/services/AddressBook.ts +37 -6
  273. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  274. package/test/unit/spec/services/ApiAiAssistant.ts +311 -21
  275. package/test/unit/spec/services/EntryPoint.ts +87 -40
  276. package/test/unit/spec/services/Queue.ts +123 -12
  277. package/test/unit/spec/services/UserPreference.ts +401 -0
  278. package/test/unit/spec/services/WebCallingService.ts +7 -1
  279. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  280. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  281. package/test/unit/spec/services/config/Util.ts +129 -0
  282. package/test/unit/spec/services/config/index.ts +97 -29
  283. package/test/unit/spec/services/core/Utils.ts +425 -8
  284. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  285. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  286. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  287. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  288. package/test/unit/spec/services/task/Task.ts +745 -0
  289. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  290. package/test/unit/spec/services/task/TaskManager.ts +2518 -1494
  291. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  292. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  293. package/test/unit/spec/services/task/contact.ts +33 -0
  294. package/test/unit/spec/services/task/dialer.ts +190 -0
  295. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  296. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  297. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  298. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  299. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  300. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  301. package/test/unit/spec/services/task/voice/Voice.ts +2061 -0
  302. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  303. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  304. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  305. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  306. package/umd/contact-center.min.js +2 -2
  307. package/umd/contact-center.min.js.map +1 -1
  308. package/dist/services/task/index.js +0 -1525
  309. package/dist/services/task/index.js.map +0 -1
  310. package/dist/types/services/task/index.d.ts +0 -650
  311. package/src/services/task/index.ts +0 -1801
  312. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -70,14 +70,16 @@ export class Queue {
70
70
  }
71
71
 
72
72
  /**
73
- * Fetches contact service queues for the organization
74
- * @param {ContactServiceQueueSearchParams} [params] - Search and pagination parameters
73
+ * Fetches contact service queues for the organization. By default, returns active inbound
74
+ * telephony queues in backend name-ascending order using the agent's desktop profile views.
75
+ * Existing filter, sort, and desktop-profile parameters override those defaults.
76
+ * @param {ContactServiceQueueSearchParams} [params] - Search, pagination, and override parameters
75
77
  * @returns {Promise<ContactServiceQueuesResponse>} Promise resolving to contact service queues
76
78
  * @throws {Error} If the API call fails
77
79
  * @public
78
80
  * @example
79
81
  * ```typescript
80
- * // Get all queues with default pagination
82
+ * // Get queues using the default list policy and pagination
81
83
  * const response = await queueAPI.getQueues();
82
84
  *
83
85
  * // Get queues with specific pagination
@@ -101,17 +103,29 @@ export class Queue {
101
103
  page = PAGINATION_DEFAULTS.PAGE,
102
104
  pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,
103
105
  search,
104
- filter,
106
+ filter = 'queueType==INBOUND;channelType==TELEPHONY;active==true',
105
107
  attributes,
106
- sortBy,
107
- sortOrder,
108
- desktopProfileFilter,
108
+ sortBy = 'name',
109
+ sortOrder = 'asc',
110
+ desktopProfileFilter = true,
109
111
  provisioningView,
110
112
  singleObjectResponse,
111
113
  } = params;
114
+ const agentView = desktopProfileFilter;
115
+ const firstLevelView = desktopProfileFilter;
112
116
 
113
117
  const orgId = this.webex.credentials.getOrgId();
114
- const isSearchRequest = !!(search || filter || attributes || sortBy);
118
+ const effectiveSortBy = sortBy ?? (sortOrder ? 'name' : undefined);
119
+ const isSearchRequest = !!(search || filter || attributes || effectiveSortBy);
120
+ const canUseCache = this.pageCache.canUseCache({
121
+ search,
122
+ filter,
123
+ attributes,
124
+ sortBy: effectiveSortBy,
125
+ desktopProfileFilter,
126
+ provisioningView,
127
+ singleObjectResponse,
128
+ });
115
129
 
116
130
  LoggerProxy.info('Fetching contact service queues', {
117
131
  module: 'Queue',
@@ -125,7 +139,7 @@ export class Queue {
125
139
  });
126
140
 
127
141
  // Check if we can use cache for simple pagination (no search/filter/attributes/sort)
128
- if (this.pageCache.canUseCache({search, filter, attributes, sortBy})) {
142
+ if (canUseCache) {
129
143
  const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);
130
144
  const cachedPage = this.pageCache.getCachedPage(cacheKey);
131
145
 
@@ -170,14 +184,17 @@ export class Queue {
170
184
  if (filter) queryParams.append('filter', filter);
171
185
  if (attributes) queryParams.append('attributes', attributes);
172
186
  if (search) queryParams.append('search', search);
173
- if (sortBy) queryParams.append('sortBy', sortBy);
174
- if (sortOrder) queryParams.append('sortOrder', sortOrder);
187
+ if (effectiveSortBy)
188
+ queryParams.append('sort', `${effectiveSortBy},${(sortOrder ?? 'asc').toUpperCase()}`);
175
189
  if (desktopProfileFilter !== undefined)
176
190
  queryParams.append('desktopProfileFilter', desktopProfileFilter.toString());
177
191
  if (provisioningView !== undefined)
178
192
  queryParams.append('provisioningView', provisioningView.toString());
179
193
  if (singleObjectResponse !== undefined)
180
194
  queryParams.append('singleObjectResponse', singleObjectResponse.toString());
195
+ if (agentView !== undefined) queryParams.append('agentView', agentView.toString());
196
+ if (firstLevelView !== undefined)
197
+ queryParams.append('firstLevelView', firstLevelView.toString());
181
198
 
182
199
  const resource = endPointMap.queueList(orgId, queryParams.toString());
183
200
 
@@ -232,7 +249,7 @@ export class Queue {
232
249
  }
233
250
 
234
251
  // Cache the page data for simple pagination (no search/filter/attributes/sort)
235
- if (this.pageCache.canUseCache({search, filter, attributes, sortBy}) && response.body?.data) {
252
+ if (canUseCache && response.body?.data) {
236
253
  const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);
237
254
  this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);
238
255
 
@@ -0,0 +1,509 @@
1
+ import {HTTP_METHODS, WebexSDK} from '../types';
2
+ import type {
3
+ UserPreference as UserPreferenceResponse,
4
+ CreateUserPreferenceRequest,
5
+ UpdateUserPreferenceRequest,
6
+ GetUserPreferenceParams,
7
+ } from './config/types';
8
+ import LoggerProxy from '../logger-proxy';
9
+ import WebexRequest from './core/WebexRequest';
10
+ import MetricsManager from '../metrics/MetricsManager';
11
+ import {WCC_API_GATEWAY} from './constants';
12
+ import {endPointMap} from './config/constants';
13
+ import {METRIC_EVENT_NAMES} from '../metrics/constants';
14
+
15
+ /**
16
+ * UserPreference API class for managing Webex Contact Center user preferences.
17
+ * Provides functionality to get, create, update, and delete user preferences.
18
+ *
19
+ * @class UserPreference
20
+ * @public
21
+ * @example
22
+ * ```typescript
23
+ * import Webex from 'webex';
24
+ *
25
+ * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });
26
+ * const cc = webex.cc;
27
+ *
28
+ * // Register and login first
29
+ * await cc.register();
30
+ * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });
31
+ *
32
+ * // Get UserPreference API instance from ContactCenter
33
+ * const userPreferenceAPI = cc.userPreference;
34
+ *
35
+ * // Get user preferences for the current user
36
+ * const preferences = await userPreferenceAPI.getUserPreference();
37
+ *
38
+ * // Create new user preferences
39
+ * const newPreferences = await userPreferenceAPI.createUserPreference({
40
+ * userId: 'user123',
41
+ * preferences: { e911Reminder: true }
42
+ * });
43
+ *
44
+ * // Update user preferences
45
+ * const updatedPreferences = await userPreferenceAPI.updateUserPreference('user123', {
46
+ * preferences: { e911Reminder: false }
47
+ * });
48
+ *
49
+ * // Delete user preferences
50
+ * await userPreferenceAPI.deleteUserPreference('user123');
51
+ * ```
52
+ */
53
+ export class UserPreference {
54
+ private webexRequest: WebexRequest;
55
+ private webex: WebexSDK;
56
+ private getUserId: () => string;
57
+ private metricsManager: MetricsManager;
58
+
59
+ /**
60
+ * Creates an instance of UserPreference
61
+ * @param {WebexSDK} webex - The Webex SDK instance
62
+ * @param {() => string} getUserId - Function to get the current user's CI user ID
63
+ * @public
64
+ */
65
+ constructor(webex: WebexSDK, getUserId: () => string) {
66
+ this.webex = webex;
67
+ this.webexRequest = WebexRequest.getInstance({webex});
68
+ this.getUserId = getUserId;
69
+ this.metricsManager = MetricsManager.getInstance({webex});
70
+ }
71
+
72
+ /**
73
+ * Fetches user preferences for a specific user
74
+ * @param {GetUserPreferenceParams} [params] - Optional parameters for fetching preferences
75
+ * @param {string} [params.userId] - User ID to fetch preferences for. Defaults to current user's CI user ID.
76
+ * @param {number} [params.page=0] - Page number (0-indexed). Default: 0
77
+ * @param {number} [params.pageSize=100] - Number of items per page. Default: 100
78
+ * @returns {Promise<UserPreferenceResponse>} Promise resolving to user preferences
79
+ * @throws {Error} If the API call fails
80
+ * @public
81
+ * @example
82
+ * ```typescript
83
+ * // Get preferences for current user
84
+ * const preferences = await userPreferenceAPI.getUserPreference();
85
+ *
86
+ * // Get preferences for a specific user
87
+ * const preferences = await userPreferenceAPI.getUserPreference({ userId: 'user123' });
88
+ *
89
+ * // Get preferences with pagination
90
+ * const preferences = await userPreferenceAPI.getUserPreference({ page: 0, pageSize: 50 });
91
+ * ```
92
+ */
93
+ public async getUserPreference(
94
+ params?: GetUserPreferenceParams
95
+ ): Promise<UserPreferenceResponse> {
96
+ const {userId, page, pageSize} = params || {};
97
+ const targetUserId = userId || this.getUserId();
98
+ const orgId = this.webex.credentials.getOrgId();
99
+
100
+ LoggerProxy.info('Fetching user preferences', {
101
+ module: 'UserPreference',
102
+ method: 'getUserPreference',
103
+ data: {
104
+ orgId,
105
+ userId: targetUserId,
106
+ page,
107
+ pageSize,
108
+ },
109
+ });
110
+
111
+ if (!targetUserId) {
112
+ LoggerProxy.error('getUserPreference called without a valid userId', {
113
+ module: 'UserPreference',
114
+ method: 'getUserPreference',
115
+ data: {
116
+ orgId,
117
+ userId: targetUserId,
118
+ error: 'Missing userId. Ensure user is logged in or provide a userId.',
119
+ },
120
+ });
121
+
122
+ throw new Error('UserPreference: userId is not available.');
123
+ }
124
+
125
+ try {
126
+ let resource = endPointMap.userPreference(orgId, targetUserId);
127
+
128
+ // Build query parameters if provided
129
+ const queryParams: string[] = [];
130
+ if (page !== undefined) queryParams.push(`page=${page}`);
131
+ if (pageSize !== undefined) queryParams.push(`pageSize=${pageSize}`);
132
+ if (queryParams.length > 0) {
133
+ resource = `${resource}?${queryParams.join('&')}`;
134
+ }
135
+
136
+ LoggerProxy.info('Making API request to fetch user preferences', {
137
+ module: 'UserPreference',
138
+ method: 'getUserPreference',
139
+ data: {
140
+ resource,
141
+ service: WCC_API_GATEWAY,
142
+ },
143
+ });
144
+
145
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS);
146
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED);
147
+
148
+ const response = await this.webexRequest.request({
149
+ service: WCC_API_GATEWAY,
150
+ resource,
151
+ method: HTTP_METHODS.GET,
152
+ });
153
+
154
+ LoggerProxy.info('Successfully retrieved user preferences', {
155
+ module: 'UserPreference',
156
+ method: 'getUserPreference',
157
+ data: {
158
+ statusCode: response.statusCode,
159
+ userId: targetUserId,
160
+ },
161
+ });
162
+
163
+ this.metricsManager.trackEvent(
164
+ METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS,
165
+ {
166
+ orgId,
167
+ userId: targetUserId,
168
+ statusCode: response.statusCode,
169
+ },
170
+ ['behavioral', 'operational']
171
+ );
172
+
173
+ return response.body;
174
+ } catch (error) {
175
+ const errorData = {
176
+ orgId,
177
+ userId: targetUserId,
178
+ error: error instanceof Error ? error.message : String(error),
179
+ };
180
+
181
+ LoggerProxy.error('Failed to fetch user preferences', {
182
+ module: 'UserPreference',
183
+ method: 'getUserPreference',
184
+ data: errorData,
185
+ error,
186
+ });
187
+
188
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED, errorData, [
189
+ 'behavioral',
190
+ 'operational',
191
+ ]);
192
+
193
+ throw error;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Creates new user preferences
199
+ * @param {CreateUserPreferenceRequest} data - The user preference data to create
200
+ * @returns {Promise<UserPreference>} Promise resolving to created user preferences
201
+ * @throws {Error} If the API call fails
202
+ * @public
203
+ * @example
204
+ * ```typescript
205
+ * const newPreferences = await userPreferenceAPI.createUserPreference({
206
+ * userId: 'user123',
207
+ * preferences: { e911Reminder: true, notificationSettings: { email: true } }
208
+ * });
209
+ * ```
210
+ */
211
+ public async createUserPreference(
212
+ data: CreateUserPreferenceRequest
213
+ ): Promise<UserPreferenceResponse> {
214
+ const orgId = this.webex.credentials.getOrgId();
215
+
216
+ LoggerProxy.info('Creating user preferences', {
217
+ module: 'UserPreference',
218
+ method: 'createUserPreference',
219
+ data: {
220
+ orgId,
221
+ userId: data.userId,
222
+ },
223
+ });
224
+
225
+ if (!data.userId) {
226
+ LoggerProxy.error('createUserPreference called without a valid userId', {
227
+ module: 'UserPreference',
228
+ method: 'createUserPreference',
229
+ data: {
230
+ orgId,
231
+ error: 'Missing userId in request data.',
232
+ },
233
+ });
234
+
235
+ throw new Error('UserPreference: userId is required to create user preferences.');
236
+ }
237
+
238
+ try {
239
+ const resource = endPointMap.userPreferenceCreate(orgId);
240
+
241
+ LoggerProxy.info('Making API request to create user preferences', {
242
+ module: 'UserPreference',
243
+ method: 'createUserPreference',
244
+ data: {
245
+ resource,
246
+ service: WCC_API_GATEWAY,
247
+ },
248
+ });
249
+
250
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS);
251
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED);
252
+
253
+ const response = await this.webexRequest.request({
254
+ service: WCC_API_GATEWAY,
255
+ resource,
256
+ method: HTTP_METHODS.POST,
257
+ body: data,
258
+ });
259
+
260
+ LoggerProxy.info('Successfully created user preferences', {
261
+ module: 'UserPreference',
262
+ method: 'createUserPreference',
263
+ data: {
264
+ statusCode: response.statusCode,
265
+ userId: data.userId,
266
+ },
267
+ });
268
+
269
+ this.metricsManager.trackEvent(
270
+ METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS,
271
+ {
272
+ orgId,
273
+ userId: data.userId,
274
+ statusCode: response.statusCode,
275
+ },
276
+ ['behavioral', 'operational']
277
+ );
278
+
279
+ return response.body;
280
+ } catch (error) {
281
+ const errorData = {
282
+ orgId,
283
+ userId: data.userId,
284
+ error: error instanceof Error ? error.message : String(error),
285
+ };
286
+
287
+ LoggerProxy.error('Failed to create user preferences', {
288
+ module: 'UserPreference',
289
+ method: 'createUserPreference',
290
+ data: errorData,
291
+ error,
292
+ });
293
+
294
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED, errorData, [
295
+ 'behavioral',
296
+ 'operational',
297
+ ]);
298
+
299
+ throw error;
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Updates existing user preferences
305
+ * @param {string} userId - User ID to update preferences for
306
+ * @param {UpdateUserPreferenceRequest} data - The user preference data to update
307
+ * @returns {Promise<UserPreference>} Promise resolving to updated user preferences
308
+ * @throws {Error} If the API call fails
309
+ * @public
310
+ * @example
311
+ * ```typescript
312
+ * const updatedPreferences = await userPreferenceAPI.updateUserPreference('user123', {
313
+ * preferences: { e911Reminder: false }
314
+ * });
315
+ * ```
316
+ */
317
+ public async updateUserPreference(
318
+ userId: string,
319
+ data: UpdateUserPreferenceRequest
320
+ ): Promise<UserPreferenceResponse> {
321
+ const orgId = this.webex.credentials.getOrgId();
322
+
323
+ LoggerProxy.info('Updating user preferences', {
324
+ module: 'UserPreference',
325
+ method: 'updateUserPreference',
326
+ data: {
327
+ orgId,
328
+ userId,
329
+ },
330
+ });
331
+
332
+ if (!userId) {
333
+ LoggerProxy.error('updateUserPreference called without a valid userId', {
334
+ module: 'UserPreference',
335
+ method: 'updateUserPreference',
336
+ data: {
337
+ orgId,
338
+ error: 'Missing userId parameter.',
339
+ },
340
+ });
341
+
342
+ throw new Error('UserPreference: userId is required to update user preferences.');
343
+ }
344
+
345
+ try {
346
+ const resource = endPointMap.userPreference(orgId, userId);
347
+
348
+ LoggerProxy.info('Making API request to update user preferences', {
349
+ module: 'UserPreference',
350
+ method: 'updateUserPreference',
351
+ data: {
352
+ resource,
353
+ service: WCC_API_GATEWAY,
354
+ },
355
+ });
356
+
357
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS);
358
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED);
359
+
360
+ const response = await this.webexRequest.request({
361
+ service: WCC_API_GATEWAY,
362
+ resource,
363
+ method: HTTP_METHODS.PUT,
364
+ body: data,
365
+ });
366
+
367
+ LoggerProxy.info('Successfully updated user preferences', {
368
+ module: 'UserPreference',
369
+ method: 'updateUserPreference',
370
+ data: {
371
+ statusCode: response.statusCode,
372
+ userId,
373
+ },
374
+ });
375
+
376
+ this.metricsManager.trackEvent(
377
+ METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS,
378
+ {
379
+ orgId,
380
+ userId,
381
+ statusCode: response.statusCode,
382
+ },
383
+ ['behavioral', 'operational']
384
+ );
385
+
386
+ return response.body;
387
+ } catch (error) {
388
+ const errorData = {
389
+ orgId,
390
+ userId,
391
+ error: error instanceof Error ? error.message : String(error),
392
+ };
393
+
394
+ LoggerProxy.error('Failed to update user preferences', {
395
+ module: 'UserPreference',
396
+ method: 'updateUserPreference',
397
+ data: errorData,
398
+ error,
399
+ });
400
+
401
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED, errorData, [
402
+ 'behavioral',
403
+ 'operational',
404
+ ]);
405
+
406
+ throw error;
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Deletes user preferences for a specific user
412
+ * @param {string} userId - User ID to delete preferences for
413
+ * @returns {Promise<void>} Promise resolving when deletion is complete
414
+ * @throws {Error} If the API call fails
415
+ * @public
416
+ * @example
417
+ * ```typescript
418
+ * await userPreferenceAPI.deleteUserPreference('user123');
419
+ * ```
420
+ */
421
+ public async deleteUserPreference(userId: string): Promise<void> {
422
+ const orgId = this.webex.credentials.getOrgId();
423
+
424
+ LoggerProxy.info('Deleting user preferences', {
425
+ module: 'UserPreference',
426
+ method: 'deleteUserPreference',
427
+ data: {
428
+ orgId,
429
+ userId,
430
+ },
431
+ });
432
+
433
+ if (!userId) {
434
+ LoggerProxy.error('deleteUserPreference called without a valid userId', {
435
+ module: 'UserPreference',
436
+ method: 'deleteUserPreference',
437
+ data: {
438
+ orgId,
439
+ error: 'Missing userId parameter.',
440
+ },
441
+ });
442
+
443
+ throw new Error('UserPreference: userId is required to delete user preferences.');
444
+ }
445
+
446
+ try {
447
+ const resource = endPointMap.userPreference(orgId, userId);
448
+
449
+ LoggerProxy.info('Making API request to delete user preferences', {
450
+ module: 'UserPreference',
451
+ method: 'deleteUserPreference',
452
+ data: {
453
+ resource,
454
+ service: WCC_API_GATEWAY,
455
+ },
456
+ });
457
+
458
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS);
459
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED);
460
+
461
+ const response = await this.webexRequest.request({
462
+ service: WCC_API_GATEWAY,
463
+ resource,
464
+ method: HTTP_METHODS.DELETE,
465
+ });
466
+
467
+ LoggerProxy.info('Successfully deleted user preferences', {
468
+ module: 'UserPreference',
469
+ method: 'deleteUserPreference',
470
+ data: {
471
+ statusCode: response.statusCode,
472
+ userId,
473
+ },
474
+ });
475
+
476
+ this.metricsManager.trackEvent(
477
+ METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS,
478
+ {
479
+ orgId,
480
+ userId,
481
+ statusCode: response.statusCode,
482
+ },
483
+ ['behavioral', 'operational']
484
+ );
485
+ } catch (error) {
486
+ const errorData = {
487
+ orgId,
488
+ userId,
489
+ error: error instanceof Error ? error.message : String(error),
490
+ };
491
+
492
+ LoggerProxy.error('Failed to delete user preferences', {
493
+ module: 'UserPreference',
494
+ method: 'deleteUserPreference',
495
+ data: errorData,
496
+ error,
497
+ });
498
+
499
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED, errorData, [
500
+ 'behavioral',
501
+ 'operational',
502
+ ]);
503
+
504
+ throw error;
505
+ }
506
+ }
507
+ }
508
+
509
+ export default UserPreference;