@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
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
8
+ var _constants = require("../constants");
9
+ var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
10
+ var _constants2 = require("../metrics/constants");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const WEBEX_CROSS_CLIENT_FILE = 'WebexCrossClientService';
13
+ const DEFAULT_CROSS_CLIENT_STATE_TTL = 900;
14
+ const EXPIRATION_OFFSET_MS = 60_000;
15
+ /** Must match Agent Desktop usersub publish — Webex App reads `wxcc` cross-client state. */
16
+ const DEFAULT_APP_NAME = 'wxcc';
17
+ const REFRESH_RETRY_DELAY_MS = 30_000;
18
+ const MAX_REFRESH_RETRIES = 3;
19
+ /**
20
+ * Publishes usersub cross-client state so Webex App suppresses native calling toasts (WXCC-6026).
21
+ */
22
+ class WebexCrossClientService {
23
+ answerCallsState = false;
24
+ appName = DEFAULT_APP_NAME;
25
+ /** Incremented on teardown/disable to ignore stale refresh timer callbacks. */
26
+ refreshGeneration = 0;
27
+ /** Monotonic id for usersub publish metrics timers; stale publishes cancel only their own timer. */
28
+ usersubPublishMetricsId = 0;
29
+ constructor(webex) {
30
+ this.webex = webex;
31
+ }
32
+ extractDeviceIdFromUrl(url) {
33
+ const match = url.match(/\/devices\/([^/?]+)/);
34
+ return match ? match[1] : '';
35
+ }
36
+ getDeviceUrl() {
37
+ return this.webex.internal.device?.url;
38
+ }
39
+ clearRefreshTimer() {
40
+ if (this.refreshTimer) {
41
+ clearTimeout(this.refreshTimer);
42
+ this.refreshTimer = undefined;
43
+ }
44
+ if (this.refreshRetryTimer) {
45
+ clearTimeout(this.refreshRetryTimer);
46
+ this.refreshRetryTimer = undefined;
47
+ }
48
+ }
49
+ scheduleRefreshRetry(userId, ttl, scheduledGeneration, retryAttempt) {
50
+ if (retryAttempt >= MAX_REFRESH_RETRIES || scheduledGeneration !== this.refreshGeneration || !this.answerCallsState) {
51
+ return;
52
+ }
53
+ this.refreshRetryTimer = setTimeout(async () => {
54
+ if (scheduledGeneration !== this.refreshGeneration || !this.answerCallsState) {
55
+ return;
56
+ }
57
+ try {
58
+ await this.setManageWebexCallingInWxcc(true, {
59
+ userId,
60
+ ttl,
61
+ appName: this.appName
62
+ });
63
+ } catch (error) {
64
+ _loggerProxy.default.error(`WebexCrossClientService refresh retry failed: ${error}`, {
65
+ module: WEBEX_CROSS_CLIENT_FILE,
66
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
67
+ });
68
+ this.scheduleRefreshRetry(userId, ttl, scheduledGeneration, retryAttempt + 1);
69
+ }
70
+ }, REFRESH_RETRY_DELAY_MS);
71
+ }
72
+ startRefreshTimer(userId, ttl) {
73
+ this.clearRefreshTimer();
74
+ if (!this.answerCallsState) {
75
+ return;
76
+ }
77
+ const refreshTime = ttl * 1000 - EXPIRATION_OFFSET_MS;
78
+ const scheduledGeneration = this.refreshGeneration;
79
+ this.refreshTimer = setTimeout(async () => {
80
+ if (scheduledGeneration !== this.refreshGeneration || !this.answerCallsState) {
81
+ return;
82
+ }
83
+ try {
84
+ await this.setManageWebexCallingInWxcc(true, {
85
+ userId,
86
+ ttl,
87
+ appName: this.appName
88
+ });
89
+ } catch (error) {
90
+ _loggerProxy.default.error(`WebexCrossClientService refresh failed: ${error}`, {
91
+ module: WEBEX_CROSS_CLIENT_FILE,
92
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
93
+ });
94
+ this.scheduleRefreshRetry(userId, ttl, scheduledGeneration, 0);
95
+ }
96
+ }, refreshTime);
97
+ }
98
+ publishCrossClientState(users, ttl, composition, logContext) {
99
+ const body = {
100
+ users,
101
+ compositions: [{
102
+ type: 'cross-client-state',
103
+ ttl,
104
+ composition
105
+ }]
106
+ };
107
+ return this.webex.request({
108
+ method: 'POST',
109
+ service: 'usersub',
110
+ resource: 'publish',
111
+ body
112
+ }).then(response => response?.body).catch(error => {
113
+ _loggerProxy.default.error(`WebexCrossClientService.${logContext} failed: ${error}`, {
114
+ module: WEBEX_CROSS_CLIENT_FILE,
115
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
116
+ });
117
+ return Promise.reject(error);
118
+ });
119
+ }
120
+ async setManageWebexCallingInWxcc(enable, options) {
121
+ const operationGeneration = this.refreshGeneration;
122
+ const userId = options?.userId ?? this.webex.internal.device?.userId;
123
+ const ttl = options?.ttl ?? DEFAULT_CROSS_CLIENT_STATE_TTL;
124
+ const appName = options?.appName ?? DEFAULT_APP_NAME;
125
+ const trackPublishMetrics = options?.trackPublishMetrics ?? false;
126
+ this.appName = appName;
127
+ if (!userId) {
128
+ const error = 'User ID is unavailable for cross-client publish';
129
+ this.trackUsersubPreflightFailure(enable, 'user_id_unavailable', error, trackPublishMetrics);
130
+ throw new Error(error);
131
+ }
132
+ const deviceUrl = this.getDeviceUrl();
133
+ if (!deviceUrl) {
134
+ const error = 'Device URL is unavailable for cross-client publish';
135
+ this.trackUsersubPreflightFailure(enable, 'device_url_unavailable', error, trackPublishMetrics);
136
+ throw new Error(error);
137
+ }
138
+ const composition = {
139
+ devices: [{
140
+ deviceId: this.extractDeviceIdFromUrl(deviceUrl),
141
+ appName,
142
+ state: {
143
+ 'answer-calls-on-wxcc': enable
144
+ }
145
+ }]
146
+ };
147
+ const metricsManager = _MetricsManager.default.getInstance();
148
+ const usersubPublishEventKeys = [_constants2.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED];
149
+ let publishMetricsId = 0;
150
+ if (trackPublishMetrics) {
151
+ this.usersubPublishMetricsId += 1;
152
+ publishMetricsId = this.usersubPublishMetricsId;
153
+ metricsManager.timeEvent(usersubPublishEventKeys);
154
+ }
155
+ try {
156
+ await this.publishCrossClientState([userId], ttl, composition, 'setManageWebexCallingInWxcc');
157
+ } catch (error) {
158
+ if (trackPublishMetrics) {
159
+ if (operationGeneration !== this.refreshGeneration) {
160
+ if (publishMetricsId === this.usersubPublishMetricsId) {
161
+ metricsManager.cancelTimedEvent(usersubPublishEventKeys);
162
+ }
163
+ } else {
164
+ metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED, {
165
+ enableWxBetterTogether: enable,
166
+ error: error instanceof Error ? error.toString() : String(error)
167
+ }, ['operational', 'behavioral']);
168
+ }
169
+ }
170
+ throw error;
171
+ }
172
+ if (operationGeneration !== this.refreshGeneration) {
173
+ if (trackPublishMetrics && publishMetricsId === this.usersubPublishMetricsId) {
174
+ metricsManager.cancelTimedEvent(usersubPublishEventKeys);
175
+ }
176
+ return;
177
+ }
178
+ this.answerCallsState = enable;
179
+ if (enable) {
180
+ this.startRefreshTimer(userId, ttl);
181
+ } else {
182
+ this.refreshGeneration += 1;
183
+ this.clearRefreshTimer();
184
+ }
185
+ if (trackPublishMetrics) {
186
+ metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS, {
187
+ enableWxBetterTogether: enable
188
+ }, ['operational', 'behavioral']);
189
+ }
190
+ _loggerProxy.default.info(`Cross-client answer-calls-on-wxcc set to ${enable}`, {
191
+ module: WEBEX_CROSS_CLIENT_FILE,
192
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC,
193
+ data: {
194
+ appName,
195
+ deviceId: this.extractDeviceIdFromUrl(deviceUrl),
196
+ ttl
197
+ }
198
+ });
199
+ }
200
+ trackUsersubPreflightFailure(enable, skipReason, error, trackPublishMetrics) {
201
+ if (!trackPublishMetrics) {
202
+ return;
203
+ }
204
+ _MetricsManager.default.getInstance().trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED, {
205
+ enableWxBetterTogether: enable,
206
+ skipReason,
207
+ error
208
+ }, ['operational', 'behavioral']);
209
+ }
210
+ teardown() {
211
+ this.refreshGeneration += 1;
212
+ this.clearRefreshTimer();
213
+ this.answerCallsState = false;
214
+ }
215
+
216
+ /** Whether usersub `answer-calls-on-wxcc: true` was successfully published this session. */
217
+ isAnswerCallsStateActive() {
218
+ return this.answerCallsState;
219
+ }
220
+ }
221
+ exports.default = WebexCrossClientService;
222
+ //# sourceMappingURL=WebexCrossClientService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_MetricsManager","_constants2","e","__esModule","default","WEBEX_CROSS_CLIENT_FILE","DEFAULT_CROSS_CLIENT_STATE_TTL","EXPIRATION_OFFSET_MS","DEFAULT_APP_NAME","REFRESH_RETRY_DELAY_MS","MAX_REFRESH_RETRIES","WebexCrossClientService","answerCallsState","appName","refreshGeneration","usersubPublishMetricsId","constructor","webex","extractDeviceIdFromUrl","url","match","getDeviceUrl","internal","device","clearRefreshTimer","refreshTimer","clearTimeout","undefined","refreshRetryTimer","scheduleRefreshRetry","userId","ttl","scheduledGeneration","retryAttempt","setTimeout","setManageWebexCallingInWxcc","error","LoggerProxy","module","method","METHODS","SET_MANAGE_WEBEX_CALLING_IN_WXCC","startRefreshTimer","refreshTime","publishCrossClientState","users","composition","logContext","body","compositions","type","request","service","resource","then","response","catch","Promise","reject","enable","options","operationGeneration","trackPublishMetrics","trackUsersubPreflightFailure","Error","deviceUrl","devices","deviceId","state","metricsManager","MetricsManager","getInstance","usersubPublishEventKeys","METRIC_EVENT_NAMES","WXAPP_USERSUB_PUBLISH_SUCCESS","WXAPP_USERSUB_PUBLISH_FAILED","publishMetricsId","timeEvent","cancelTimedEvent","trackEvent","enableWxBetterTogether","toString","String","info","data","skipReason","teardown","isAnswerCallsStateActive","exports"],"sources":["WebexCrossClientService.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport {METHODS} from '../constants';\nimport {WebexSDK} from '../types';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\nconst WEBEX_CROSS_CLIENT_FILE = 'WebexCrossClientService';\nconst DEFAULT_CROSS_CLIENT_STATE_TTL = 900;\nconst EXPIRATION_OFFSET_MS = 60_000;\n/** Must match Agent Desktop usersub publish — Webex App reads `wxcc` cross-client state. */\nconst DEFAULT_APP_NAME = 'wxcc';\nconst REFRESH_RETRY_DELAY_MS = 30_000;\nconst MAX_REFRESH_RETRIES = 3;\n\ntype RefreshTimer = ReturnType<typeof setTimeout>;\n\n/**\n * Publishes usersub cross-client state so Webex App suppresses native calling toasts (WXCC-6026).\n */\nexport default class WebexCrossClientService {\n private webex: WebexSDK;\n private refreshTimer?: RefreshTimer;\n private refreshRetryTimer?: RefreshTimer;\n private answerCallsState = false;\n private appName = DEFAULT_APP_NAME;\n /** Incremented on teardown/disable to ignore stale refresh timer callbacks. */\n private refreshGeneration = 0;\n /** Monotonic id for usersub publish metrics timers; stale publishes cancel only their own timer. */\n private usersubPublishMetricsId = 0;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n }\n\n private extractDeviceIdFromUrl(url: string): string {\n const match = url.match(/\\/devices\\/([^/?]+)/);\n\n return match ? match[1] : '';\n }\n\n private getDeviceUrl(): string | undefined {\n return this.webex.internal.device?.url;\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n\n if (this.refreshRetryTimer) {\n clearTimeout(this.refreshRetryTimer);\n this.refreshRetryTimer = undefined;\n }\n }\n\n private scheduleRefreshRetry(\n userId: string,\n ttl: number,\n scheduledGeneration: number,\n retryAttempt: number\n ): void {\n if (\n retryAttempt >= MAX_REFRESH_RETRIES ||\n scheduledGeneration !== this.refreshGeneration ||\n !this.answerCallsState\n ) {\n return;\n }\n\n this.refreshRetryTimer = setTimeout(async () => {\n if (scheduledGeneration !== this.refreshGeneration || !this.answerCallsState) {\n return;\n }\n\n try {\n await this.setManageWebexCallingInWxcc(true, {userId, ttl, appName: this.appName});\n } catch (error) {\n LoggerProxy.error(`WebexCrossClientService refresh retry failed: ${error}`, {\n module: WEBEX_CROSS_CLIENT_FILE,\n method: METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC,\n });\n this.scheduleRefreshRetry(userId, ttl, scheduledGeneration, retryAttempt + 1);\n }\n }, REFRESH_RETRY_DELAY_MS);\n }\n\n private startRefreshTimer(userId: string, ttl: number): void {\n this.clearRefreshTimer();\n\n if (!this.answerCallsState) {\n return;\n }\n\n const refreshTime = ttl * 1000 - EXPIRATION_OFFSET_MS;\n const scheduledGeneration = this.refreshGeneration;\n this.refreshTimer = setTimeout(async () => {\n if (scheduledGeneration !== this.refreshGeneration || !this.answerCallsState) {\n return;\n }\n\n try {\n await this.setManageWebexCallingInWxcc(true, {userId, ttl, appName: this.appName});\n } catch (error) {\n LoggerProxy.error(`WebexCrossClientService refresh failed: ${error}`, {\n module: WEBEX_CROSS_CLIENT_FILE,\n method: METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC,\n });\n this.scheduleRefreshRetry(userId, ttl, scheduledGeneration, 0);\n }\n }, refreshTime);\n }\n\n private publishCrossClientState(\n users: string[],\n ttl: number,\n composition: Record<string, unknown>,\n logContext: string\n ): Promise<unknown> {\n const body = {\n users,\n compositions: [\n {\n type: 'cross-client-state',\n ttl,\n composition,\n },\n ],\n };\n\n return this.webex\n .request({\n method: 'POST',\n service: 'usersub',\n resource: 'publish',\n body,\n })\n .then((response: {body?: unknown}) => response?.body)\n .catch((error: unknown) => {\n LoggerProxy.error(`WebexCrossClientService.${logContext} failed: ${error}`, {\n module: WEBEX_CROSS_CLIENT_FILE,\n method: METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC,\n });\n\n return Promise.reject(error);\n });\n }\n\n public async setManageWebexCallingInWxcc(\n enable: boolean,\n options?: {userId?: string; ttl?: number; appName?: string; trackPublishMetrics?: boolean}\n ): Promise<void> {\n const operationGeneration = this.refreshGeneration;\n const userId = options?.userId ?? this.webex.internal.device?.userId;\n const ttl = options?.ttl ?? DEFAULT_CROSS_CLIENT_STATE_TTL;\n const appName = options?.appName ?? DEFAULT_APP_NAME;\n const trackPublishMetrics = options?.trackPublishMetrics ?? false;\n this.appName = appName;\n\n if (!userId) {\n const error = 'User ID is unavailable for cross-client publish';\n this.trackUsersubPreflightFailure(enable, 'user_id_unavailable', error, trackPublishMetrics);\n throw new Error(error);\n }\n\n const deviceUrl = this.getDeviceUrl();\n if (!deviceUrl) {\n const error = 'Device URL is unavailable for cross-client publish';\n this.trackUsersubPreflightFailure(\n enable,\n 'device_url_unavailable',\n error,\n trackPublishMetrics\n );\n throw new Error(error);\n }\n\n const composition = {\n devices: [\n {\n deviceId: this.extractDeviceIdFromUrl(deviceUrl),\n appName,\n state: {\n 'answer-calls-on-wxcc': enable,\n },\n },\n ],\n };\n\n const metricsManager = MetricsManager.getInstance();\n const usersubPublishEventKeys = [\n METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED,\n ];\n\n let publishMetricsId = 0;\n if (trackPublishMetrics) {\n this.usersubPublishMetricsId += 1;\n publishMetricsId = this.usersubPublishMetricsId;\n metricsManager.timeEvent(usersubPublishEventKeys);\n }\n\n try {\n await this.publishCrossClientState([userId], ttl, composition, 'setManageWebexCallingInWxcc');\n } catch (error) {\n if (trackPublishMetrics) {\n if (operationGeneration !== this.refreshGeneration) {\n if (publishMetricsId === this.usersubPublishMetricsId) {\n metricsManager.cancelTimedEvent(usersubPublishEventKeys);\n }\n } else {\n metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED,\n {\n enableWxBetterTogether: enable,\n error: error instanceof Error ? error.toString() : String(error),\n },\n ['operational', 'behavioral']\n );\n }\n }\n\n throw error;\n }\n\n if (operationGeneration !== this.refreshGeneration) {\n if (trackPublishMetrics && publishMetricsId === this.usersubPublishMetricsId) {\n metricsManager.cancelTimedEvent(usersubPublishEventKeys);\n }\n\n return;\n }\n\n this.answerCallsState = enable;\n\n if (enable) {\n this.startRefreshTimer(userId, ttl);\n } else {\n this.refreshGeneration += 1;\n this.clearRefreshTimer();\n }\n\n if (trackPublishMetrics) {\n metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS,\n {enableWxBetterTogether: enable},\n ['operational', 'behavioral']\n );\n }\n\n LoggerProxy.info(`Cross-client answer-calls-on-wxcc set to ${enable}`, {\n module: WEBEX_CROSS_CLIENT_FILE,\n method: METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC,\n data: {\n appName,\n deviceId: this.extractDeviceIdFromUrl(deviceUrl),\n ttl,\n },\n });\n }\n\n private trackUsersubPreflightFailure(\n enable: boolean,\n skipReason: 'user_id_unavailable' | 'device_url_unavailable',\n error: string,\n trackPublishMetrics: boolean\n ): void {\n if (!trackPublishMetrics) {\n return;\n }\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED,\n {\n enableWxBetterTogether: enable,\n skipReason,\n error,\n },\n ['operational', 'behavioral']\n );\n }\n\n public teardown(): void {\n this.refreshGeneration += 1;\n this.clearRefreshTimer();\n this.answerCallsState = false;\n }\n\n /** Whether usersub `answer-calls-on-wxcc: true` was successfully published this session. */\n public isAnswerCallsStateActive(): boolean {\n return this.answerCallsState;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.TELEPHONY_CALL_UNMUTED = exports.TELEPHONY_CALL_MUTED = void 0;
7
+ var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
8
+ var _constants = require("../constants");
9
+ var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
10
+ var _constants2 = require("../metrics/constants");
11
+ var _wxAppDiagnosticLogging = require("./wxAppDiagnosticLogging");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const WXAPP_TELEPHONY_MERCURY_SYNC_FILE = 'WxAppTelephonyMercurySync';
14
+ const TELEPHONY_CALL_MUTED = exports.TELEPHONY_CALL_MUTED = 'event:telephony_calls.muted';
15
+ const TELEPHONY_CALL_UNMUTED = exports.TELEPHONY_CALL_UNMUTED = 'event:telephony_calls.unmuted';
16
+ /**
17
+ * Subscribes to Mercury telephony mute/unmute events for wxApp thick-client sync (AD parity).
18
+ */
19
+ class WxAppTelephonyMercurySync {
20
+ constructor(webex) {
21
+ this.webex = webex;
22
+ }
23
+ decodeBase64(value) {
24
+ try {
25
+ return atob(value);
26
+ } catch {
27
+ return value;
28
+ }
29
+ }
30
+ handleMuteStateEvent = (agentId, event) => {
31
+ const {
32
+ actorId,
33
+ callId,
34
+ muted
35
+ } = event?.data ?? {};
36
+ if (!actorId || !callId || muted === undefined) {
37
+ (0, _wxAppDiagnosticLogging.logWxAppMercuryMuteSync)({
38
+ phase: 'dropped',
39
+ dropReason: 'missing_mercury_event_fields'
40
+ });
41
+ return;
42
+ }
43
+ const decodedActorId = this.decodeBase64(actorId);
44
+ const decodedCallId = this.decodeBase64(callId);
45
+ if (!decodedActorId.endsWith(agentId)) {
46
+ (0, _wxAppDiagnosticLogging.logWxAppMercuryMuteSync)({
47
+ phase: 'dropped',
48
+ muted,
49
+ callIdSuffix: (0, _wxAppDiagnosticLogging.callIdSuffix)(decodedCallId),
50
+ dropReason: 'actor_id_mismatch'
51
+ });
52
+ return;
53
+ }
54
+ (0, _wxAppDiagnosticLogging.logWxAppMercuryMuteSync)({
55
+ phase: 'received',
56
+ muted,
57
+ callIdSuffix: (0, _wxAppDiagnosticLogging.callIdSuffix)(decodedCallId)
58
+ });
59
+ this.muteChangeHandler?.(decodedCallId, muted);
60
+ };
61
+ subscribe(agentId, onMuteChange) {
62
+ this.unsubscribe();
63
+ const mercury = this.webex.internal.mercury;
64
+ if (!mercury) {
65
+ _loggerProxy.default.error('Mercury is unavailable for wxApp mute sync', {
66
+ module: WXAPP_TELEPHONY_MERCURY_SYNC_FILE,
67
+ method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
68
+ });
69
+ _MetricsManager.default.getInstance().trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
70
+ error: 'Mercury is unavailable for wxApp mute sync'
71
+ }, ['operational', 'behavioral']);
72
+ return;
73
+ }
74
+ this.subscribedAgentId = agentId;
75
+ this.muteChangeHandler = onMuteChange;
76
+ this.boundMuteHandler = event => {
77
+ this.handleMuteStateEvent(agentId, event);
78
+ };
79
+ this.boundUnmuteHandler = event => {
80
+ this.handleMuteStateEvent(agentId, event);
81
+ };
82
+ mercury.on(TELEPHONY_CALL_MUTED, this.boundMuteHandler);
83
+ mercury.on(TELEPHONY_CALL_UNMUTED, this.boundUnmuteHandler);
84
+ _MetricsManager.default.getInstance().trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_SUCCESS, {}, ['operational', 'behavioral']);
85
+ _loggerProxy.default.info('Subscribed to wxApp telephony Mercury mute sync', {
86
+ module: WXAPP_TELEPHONY_MERCURY_SYNC_FILE,
87
+ method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
88
+ });
89
+ }
90
+ unsubscribe() {
91
+ const mercury = this.webex.internal.mercury;
92
+ if (mercury && this.boundMuteHandler) {
93
+ mercury.off(TELEPHONY_CALL_MUTED, this.boundMuteHandler);
94
+ }
95
+ if (mercury && this.boundUnmuteHandler) {
96
+ mercury.off(TELEPHONY_CALL_UNMUTED, this.boundUnmuteHandler);
97
+ }
98
+ this.subscribedAgentId = undefined;
99
+ this.muteChangeHandler = undefined;
100
+ this.boundMuteHandler = undefined;
101
+ this.boundUnmuteHandler = undefined;
102
+ }
103
+ isSubscribed() {
104
+ return Boolean(this.subscribedAgentId && this.muteChangeHandler);
105
+ }
106
+ }
107
+ exports.default = WxAppTelephonyMercurySync;
108
+ //# sourceMappingURL=WxAppTelephonyMercurySync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_MetricsManager","_constants2","_wxAppDiagnosticLogging","e","__esModule","default","WXAPP_TELEPHONY_MERCURY_SYNC_FILE","TELEPHONY_CALL_MUTED","exports","TELEPHONY_CALL_UNMUTED","WxAppTelephonyMercurySync","constructor","webex","decodeBase64","value","atob","handleMuteStateEvent","agentId","event","actorId","callId","muted","data","undefined","logWxAppMercuryMuteSync","phase","dropReason","decodedActorId","decodedCallId","endsWith","callIdSuffix","muteChangeHandler","subscribe","onMuteChange","unsubscribe","mercury","internal","LoggerProxy","error","module","method","METHODS","SYNC_WXAPP_MUTE_FROM_MERCURY","MetricsManager","getInstance","trackEvent","METRIC_EVENT_NAMES","WXAPP_MERCURY_SUBSCRIBE_FAILED","subscribedAgentId","boundMuteHandler","boundUnmuteHandler","on","WXAPP_MERCURY_SUBSCRIBE_SUCCESS","info","off","isSubscribed","Boolean"],"sources":["WxAppTelephonyMercurySync.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport {METHODS} from '../constants';\nimport {WebexSDK} from '../types';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {callIdSuffix, logWxAppMercuryMuteSync} from './wxAppDiagnosticLogging';\n\nconst WXAPP_TELEPHONY_MERCURY_SYNC_FILE = 'WxAppTelephonyMercurySync';\n\nexport const TELEPHONY_CALL_MUTED = 'event:telephony_calls.muted';\nexport const TELEPHONY_CALL_UNMUTED = 'event:telephony_calls.unmuted';\n\nexport type UpdatedCallMuteStateEvent = {\n data: {\n actorId: string;\n callId: string;\n muted: boolean;\n };\n};\n\ntype MuteChangeHandler = (callId: string, muted: boolean) => void;\n\n/**\n * Subscribes to Mercury telephony mute/unmute events for wxApp thick-client sync (AD parity).\n */\nexport default class WxAppTelephonyMercurySync {\n private webex: WebexSDK;\n private subscribedAgentId?: string;\n private muteChangeHandler?: MuteChangeHandler;\n private boundMuteHandler?: (event: UpdatedCallMuteStateEvent) => void;\n private boundUnmuteHandler?: (event: UpdatedCallMuteStateEvent) => void;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n }\n\n private decodeBase64(value: string): string {\n try {\n return atob(value);\n } catch {\n return value;\n }\n }\n\n private handleMuteStateEvent = (agentId: string, event: UpdatedCallMuteStateEvent): void => {\n const {actorId, callId, muted} = event?.data ?? {};\n if (!actorId || !callId || muted === undefined) {\n logWxAppMercuryMuteSync({\n phase: 'dropped',\n dropReason: 'missing_mercury_event_fields',\n });\n\n return;\n }\n\n const decodedActorId = this.decodeBase64(actorId);\n const decodedCallId = this.decodeBase64(callId);\n\n if (!decodedActorId.endsWith(agentId)) {\n logWxAppMercuryMuteSync({\n phase: 'dropped',\n muted,\n callIdSuffix: callIdSuffix(decodedCallId),\n dropReason: 'actor_id_mismatch',\n });\n\n return;\n }\n\n logWxAppMercuryMuteSync({\n phase: 'received',\n muted,\n callIdSuffix: callIdSuffix(decodedCallId),\n });\n\n this.muteChangeHandler?.(decodedCallId, muted);\n };\n\n public subscribe(agentId: string, onMuteChange: MuteChangeHandler): void {\n this.unsubscribe();\n\n const mercury = this.webex.internal.mercury;\n if (!mercury) {\n LoggerProxy.error('Mercury is unavailable for wxApp mute sync', {\n module: WXAPP_TELEPHONY_MERCURY_SYNC_FILE,\n method: METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY,\n });\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED,\n {error: 'Mercury is unavailable for wxApp mute sync'},\n ['operational', 'behavioral']\n );\n\n return;\n }\n\n this.subscribedAgentId = agentId;\n this.muteChangeHandler = onMuteChange;\n\n this.boundMuteHandler = (event: UpdatedCallMuteStateEvent) => {\n this.handleMuteStateEvent(agentId, event);\n };\n this.boundUnmuteHandler = (event: UpdatedCallMuteStateEvent) => {\n this.handleMuteStateEvent(agentId, event);\n };\n\n mercury.on(TELEPHONY_CALL_MUTED, this.boundMuteHandler);\n mercury.on(TELEPHONY_CALL_UNMUTED, this.boundUnmuteHandler);\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_SUCCESS,\n {},\n ['operational', 'behavioral']\n );\n\n LoggerProxy.info('Subscribed to wxApp telephony Mercury mute sync', {\n module: WXAPP_TELEPHONY_MERCURY_SYNC_FILE,\n method: METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY,\n });\n }\n\n public unsubscribe(): void {\n const mercury = this.webex.internal.mercury;\n\n if (mercury && this.boundMuteHandler) {\n mercury.off(TELEPHONY_CALL_MUTED, this.boundMuteHandler);\n }\n if (mercury && this.boundUnmuteHandler) {\n mercury.off(TELEPHONY_CALL_UNMUTED, this.boundUnmuteHandler);\n }\n\n this.subscribedAgentId = undefined;\n this.muteChangeHandler = undefined;\n this.boundMuteHandler = undefined;\n this.boundUnmuteHandler = undefined;\n }\n\n public isSubscribed(): boolean {\n return Boolean(this.subscribedAgentId && this.muteChangeHandler);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.parseAgentConfigs = parseAgentConfigs;
7
7
  var _constants = require("../core/constants");
8
+ var _constants2 = require("./constants");
8
9
  var _types = require("./types");
9
10
  /**
10
11
  * Get the URL mapping for the given name
@@ -133,10 +134,12 @@ function parseAgentConfigs(profileData) {
133
134
  }); // pushing available state to idle codes
134
135
 
135
136
  const defaultWrapUpData = getDefaultWrapUpCode(wrapupCodes);
136
- const aiFeature = aiFeatureFlags?.data && aiFeatureFlags.data.length > 0 ? aiFeatureFlags.data[0] : undefined;
137
+ const aiFeature = aiFeatureFlags?.data?.length > 0 ? aiFeatureFlags.data[0] : undefined;
138
+ const isWellnessConfigured = aiFeature?.agentWellbeing?.enable === true && aiFeature.agentWellbeing.wellnessBreakReminders === _constants2.WELLNESS_BREAK_REMINDERS_ENABLED;
139
+ const hasAIAssistantLicense = (orgSettingsData.aiAssistantQuantity ?? 0) > 0;
137
140
  const finalData = {
138
141
  teams: teamData,
139
- defaultDn: userData.defaultDialledNumber,
142
+ defaultDn: userData.deafultDialledNumber,
140
143
  forceDefaultDn: tenantData.forceDefaultDn,
141
144
  forceDefaultDnForAgent: getDefaultAgentDN(agentProfileData.agentDNValidation),
142
145
  regexUS: tenantData.dnDefaultRegex,
@@ -179,11 +182,14 @@ function parseAgentConfigs(profileData) {
179
182
  isAgentAvailableAfterOutdial: agentProfileData.agentAvailableAfterOutdial,
180
183
  outDialEp: agentProfileData.outdialEntryPointId,
181
184
  isCampaignManagementEnabled: orgSettingsData.campaignManagerEnabled,
182
- isEndCallEnabled: tenantData.endCallEnabled,
185
+ isEndTaskEnabled: tenantData.endCallEnabled,
183
186
  isEndConsultEnabled: tenantData.endConsultEnabled,
184
187
  callVariablesSuppressed: tenantData.callVariablesSuppressed,
185
188
  agentDbId: userData.dbId,
186
189
  allowConsultToQueue: agentProfileData.consultToQueue,
190
+ accessQueue: agentProfileData.accessQueue,
191
+ accessEntryPoint: agentProfileData.accessEntryPoint,
192
+ accessBuddyTeam: agentProfileData.accessBuddyTeam,
187
193
  agentPersonalStatsEnabled: agentProfileData.viewableStatistics ? agentProfileData.viewableStatistics.agentStats : false,
188
194
  addressBookId: agentProfileData.addressBookId,
189
195
  outdialANIId: agentProfileData.outdialANIId,
@@ -200,7 +206,8 @@ function parseAgentConfigs(profileData) {
200
206
  microsoftConfig: getMsftConfig(agentProfileData),
201
207
  webexConfig: getWebexConfig(agentProfileData),
202
208
  lostConnectionRecoveryTimeout: tenantData.lostConnectionRecoveryTimeout || _constants.LOST_CONNECTION_RECOVERY_TIMEOUT,
203
- aiFeature
209
+ aiFeature,
210
+ isWellnessBreakEnabled: isWellnessConfigured && hasAIAssistantLicense
204
211
  };
205
212
  return finalData;
206
213
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_constants","require","_types","getUrlMapping","urlMappings","name","mappedUrl","find","mapping","url","getMsftConfig","agentProfileData","showUserDetailsMS","stateSynchronizationMS","getWebexConfig","showUserDetailsWebex","stateSynchronizationWebex","getDefaultAgentDN","agentDNValidation","getFilteredDialplanEntries","dialPlanData","profileDialPlans","dialPlanEntries","forEach","dailPlan","includes","id","filteredPlan","regex","regularExpression","prefix","strippedChars","push","getFilterAuxCodes","auxCodes","type","specificCodes","filteredAuxCodes","auxCode","workTypeCode","active","length","isSystem","isSystemCode","isDefault","defaultCode","getDefaultWrapUpCode","wrapUpReasonList","c","parseAgentConfigs","profileData","userData","teamData","tenantData","orgInfoData","orgSettingsData","urlMapping","aiFeatureFlags","tenantDataTimeout","timeoutDesktopInactivityEnabled","timeoutDesktopInactivityMins","inactivityTimeoutTimer","timeoutDesktopInactivityCustomEnabled","wrapupCodes","WRAP_UP_CODE","accessWrapUpCode","wrapUpCodes","idleCodes","IDLE_CODE","accessIdleCode","defaultWrapUpData","aiFeature","data","undefined","finalData","teams","defaultDn","defaultDialledNumber","forceDefaultDn","forceDefaultDnForAgent","regexUS","dnDefaultRegex","regexOther","dnOtherRegex","agentId","ciUserId","agentName","firstName","lastName","agentMailId","email","agentProfileID","agentProfileId","autoAnswer","dialPlan","dialPlanEnabled","dialPlanEntity","dialPlans","multimediaProfileId","skillProfileId","siteId","enterpriseId","tenantId","tenantTimezone","timezone","environment","privacyShieldVisible","organizationIdleCodes","idleCodesAccess","wrapUpData","wrapUpProps","autoWrapup","autoWrapUp","autoWrapupInterval","autoWrapAfterSeconds","lastAgentRoute","lastAgentRouting","wrapUpCodeAccess","allowCancelAutoWrapup","allowAutoWrapUpExtension","defaultWrapupCode","isOutboundEnabledForTenant","outdialEnabled","isOutboundEnabledForAgent","isAdhocDialingEnabled","isAgentAvailableAfterOutdial","agentAvailableAfterOutdial","outDialEp","outdialEntryPointId","isCampaignManagementEnabled","campaignManagerEnabled","isEndCallEnabled","endCallEnabled","isEndConsultEnabled","endConsultEnabled","callVariablesSuppressed","agentDbId","dbId","allowConsultToQueue","consultToQueue","agentPersonalStatsEnabled","viewableStatistics","agentStats","addressBookId","outdialANIId","analyserUserId","acqueonApiUrl","acqueonConsoleUrl","isTimeoutDesktopInactivityEnabled","loginVoiceOptions","webRtcEnabled","maskSensitiveData","microsoftConfig","webexConfig","lostConnectionRecoveryTimeout","LOST_CONNECTION_RECOVERY_TIMEOUT"],"sources":["Util.ts"],"sourcesContent":["import {LOST_CONNECTION_RECOVERY_TIMEOUT} from '../core/constants';\nimport {\n AgentResponse,\n AuxCode,\n AuxCodeType,\n DesktopProfileResponse,\n DialPlanEntity,\n Entity,\n IDLE_CODE,\n OrgInfo,\n OrgSettings,\n Profile,\n Team,\n TenantData,\n URLMapping,\n WRAP_UP_CODE,\n AIFeatureFlagsResponse,\n AIFeatureFlags,\n} from './types';\n\n/**\n * Get the URL mapping for the given name\n * @param {Array<URLMapping>} urlMappings\n * @param {string} name\n * @returns {string}\n */\nconst getUrlMapping = (urlMappings: Array<URLMapping>, name: string) => {\n const mappedUrl = urlMappings.find((mapping) => mapping.name === name)?.url;\n\n return mappedUrl || '';\n};\n\n/**\n * Get the MSFT and Webex configuration\n * @param {DesktopProfileResponse} agentProfileData\n * @returns {Object}\n */\nconst getMsftConfig = (agentProfileData: DesktopProfileResponse) => {\n return {\n showUserDetailsMS: agentProfileData.showUserDetailsMS ?? false,\n stateSynchronizationMS: agentProfileData.stateSynchronizationMS ?? false,\n };\n};\n\n/**\n * Get the Webex configuration\n * @param {DesktopProfileResponse} agentProfileData\n * @returns {Object}\n */\nconst getWebexConfig = (agentProfileData: DesktopProfileResponse) => {\n return {\n showUserDetailsWebex: agentProfileData.showUserDetailsWebex ?? false,\n stateSynchronizationWebex: agentProfileData.stateSynchronizationWebex ?? false,\n };\n};\n\n/**\n * Get the default agent DN\n * @param {string} agentDNValidation\n * @returns {boolean}\n */\nconst getDefaultAgentDN = (agentDNValidation: string) => {\n return agentDNValidation === 'PROVISIONED_VALUE';\n};\n\n/**\n * Get the filtered dialplan entries\n * @param {Array<DialPlanEntity>} dialPlanData\n * @param {Array<string>} profileDialPlans\n * @returns {Array<Entity>}\n */\nconst getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[], profileDialPlans: string[]) => {\n const dialPlanEntries = [];\n dialPlanData.forEach((dailPlan: DialPlanEntity) => {\n if (profileDialPlans.includes(dailPlan.id)) {\n const filteredPlan = {\n regex: dailPlan.regularExpression,\n prefix: dailPlan.prefix,\n strippedChars: dailPlan.strippedChars,\n name: dailPlan.name,\n };\n dialPlanEntries.push(filteredPlan);\n }\n });\n\n return dialPlanEntries;\n};\n\n/**\n * Get the filtered aux codes\n * @param {Array<AuxCode>} auxCodes\n * @param {AuxCodeType} type\n * @param {Array<string>} specificCodes\n * @returns {Array<Entity>}\n */\nconst getFilterAuxCodes = (\n auxCodes: Array<AuxCode>,\n type: AuxCodeType,\n specificCodes: string[]\n) => {\n const filteredAuxCodes: Array<Entity> = [];\n auxCodes.forEach((auxCode: AuxCode) => {\n if (\n auxCode.workTypeCode === type &&\n auxCode.active &&\n (specificCodes.length === 0 || specificCodes.includes(auxCode.id))\n ) {\n filteredAuxCodes.push({\n id: auxCode.id,\n name: auxCode.name,\n isSystem: auxCode.isSystemCode,\n isDefault: auxCode.defaultCode,\n });\n }\n });\n\n return filteredAuxCodes;\n};\n\n/**\n * Get the default wrapup code\n * @param {Array<Entity>} wrapUpReasonList\n * @returns {Entity}\n */\nfunction getDefaultWrapUpCode(wrapUpReasonList: Entity[]) {\n return wrapUpReasonList?.find((c: Entity) => c.isDefault);\n}\n\n/**\n * Parse the agent configurations\n * @param {Object} profileData\n * @returns {Profile}\n */\nfunction parseAgentConfigs(profileData: {\n userData: AgentResponse;\n teamData: Team[];\n tenantData: TenantData;\n orgInfoData: OrgInfo;\n auxCodes: AuxCode[];\n orgSettingsData: OrgSettings;\n agentProfileData: DesktopProfileResponse;\n dialPlanData: DialPlanEntity[];\n urlMapping: URLMapping[];\n multimediaProfileId: string;\n aiFeatureFlags: AIFeatureFlagsResponse;\n}): Profile {\n const {\n userData,\n teamData,\n tenantData,\n orgInfoData,\n auxCodes,\n orgSettingsData,\n agentProfileData,\n dialPlanData,\n urlMapping,\n aiFeatureFlags,\n } = profileData;\n\n const tenantDataTimeout = tenantData.timeoutDesktopInactivityEnabled\n ? tenantData.timeoutDesktopInactivityMins\n : null;\n const inactivityTimeoutTimer = agentProfileData.timeoutDesktopInactivityCustomEnabled\n ? agentProfileData.timeoutDesktopInactivityMins\n : tenantDataTimeout;\n\n const wrapupCodes = getFilterAuxCodes(\n auxCodes,\n WRAP_UP_CODE,\n agentProfileData.accessWrapUpCode === 'ALL' ? [] : agentProfileData.wrapUpCodes\n );\n\n const idleCodes = getFilterAuxCodes(\n auxCodes,\n IDLE_CODE,\n agentProfileData.accessIdleCode === 'ALL' ? [] : agentProfileData.idleCodes\n );\n\n idleCodes.push({\n id: '0',\n name: 'Available',\n isSystem: false,\n isDefault: false,\n }); // pushing available state to idle codes\n\n const defaultWrapUpData = getDefaultWrapUpCode(wrapupCodes);\n const aiFeature: AIFeatureFlags | undefined =\n aiFeatureFlags?.data && aiFeatureFlags.data.length > 0 ? aiFeatureFlags.data[0] : undefined;\n\n const finalData = {\n teams: teamData,\n defaultDn: userData.defaultDialledNumber,\n forceDefaultDn: tenantData.forceDefaultDn,\n forceDefaultDnForAgent: getDefaultAgentDN(agentProfileData.agentDNValidation),\n regexUS: tenantData.dnDefaultRegex,\n regexOther: tenantData.dnOtherRegex,\n agentId: userData.ciUserId,\n agentName: `${userData.firstName} ${userData.lastName}`,\n agentMailId: userData.email,\n agentProfileID: userData.agentProfileId,\n autoAnswer: agentProfileData.autoAnswer,\n dialPlan: agentProfileData.dialPlanEnabled\n ? {\n type: 'adhocDial',\n dialPlanEntity: getFilteredDialplanEntries(dialPlanData, agentProfileData.dialPlans),\n }\n : undefined,\n multimediaProfileId: profileData.multimediaProfileId,\n skillProfileId: userData.skillProfileId ? userData.skillProfileId : null,\n siteId: userData.siteId,\n enterpriseId: orgInfoData.tenantId,\n tenantTimezone: orgInfoData.timezone,\n environment: orgInfoData.environment,\n privacyShieldVisible: tenantData.privacyShieldVisible,\n organizationIdleCodes: [], // TODO: for supervisor, getOrgFilteredIdleCodes(auxCodes, false),\n idleCodesAccess: agentProfileData.accessIdleCode as 'ALL' | 'SPECIFIC',\n idleCodes,\n wrapupCodes,\n wrapUpData: {\n wrapUpProps: {\n autoWrapup: agentProfileData.autoWrapUp,\n autoWrapupInterval: agentProfileData.autoWrapAfterSeconds,\n lastAgentRoute: agentProfileData.lastAgentRouting,\n wrapUpCodeAccess: agentProfileData.accessWrapUpCode,\n wrapUpReasonList: wrapupCodes,\n allowCancelAutoWrapup: agentProfileData.allowAutoWrapUpExtension,\n },\n },\n defaultWrapupCode: defaultWrapUpData?.id ?? '',\n isOutboundEnabledForTenant: tenantData.outdialEnabled,\n isOutboundEnabledForAgent: agentProfileData.outdialEnabled,\n isAdhocDialingEnabled: agentProfileData.dialPlanEnabled,\n isAgentAvailableAfterOutdial: agentProfileData.agentAvailableAfterOutdial,\n outDialEp: agentProfileData.outdialEntryPointId,\n isCampaignManagementEnabled: orgSettingsData.campaignManagerEnabled,\n isEndCallEnabled: tenantData.endCallEnabled,\n isEndConsultEnabled: tenantData.endConsultEnabled,\n callVariablesSuppressed: tenantData.callVariablesSuppressed,\n agentDbId: userData.dbId,\n allowConsultToQueue: agentProfileData.consultToQueue,\n agentPersonalStatsEnabled: agentProfileData.viewableStatistics\n ? agentProfileData.viewableStatistics.agentStats\n : false,\n addressBookId: agentProfileData.addressBookId,\n outdialANIId: agentProfileData.outdialANIId,\n analyserUserId: userData.id,\n\n urlMappings: {\n acqueonApiUrl: getUrlMapping(urlMapping, 'ACQUEON_API_URL'),\n acqueonConsoleUrl: getUrlMapping(urlMapping, 'ACQUEON_CONSOLE_URL'),\n },\n isTimeoutDesktopInactivityEnabled: tenantData.timeoutDesktopInactivityEnabled,\n timeoutDesktopInactivityMins: inactivityTimeoutTimer,\n loginVoiceOptions: agentProfileData.loginVoiceOptions ?? [],\n webRtcEnabled: orgSettingsData.webRtcEnabled,\n maskSensitiveData: orgSettingsData.maskSensitiveData\n ? orgSettingsData.maskSensitiveData\n : false,\n microsoftConfig: getMsftConfig(agentProfileData),\n webexConfig: getWebexConfig(agentProfileData),\n lostConnectionRecoveryTimeout:\n tenantData.lostConnectionRecoveryTimeout || LOST_CONNECTION_RECOVERY_TIMEOUT,\n aiFeature,\n };\n\n return finalData;\n}\n\nexport {parseAgentConfigs};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_constants","require","_constants2","_types","getUrlMapping","urlMappings","name","mappedUrl","find","mapping","url","getMsftConfig","agentProfileData","showUserDetailsMS","stateSynchronizationMS","getWebexConfig","showUserDetailsWebex","stateSynchronizationWebex","getDefaultAgentDN","agentDNValidation","getFilteredDialplanEntries","dialPlanData","profileDialPlans","dialPlanEntries","forEach","dailPlan","includes","id","filteredPlan","regex","regularExpression","prefix","strippedChars","push","getFilterAuxCodes","auxCodes","type","specificCodes","filteredAuxCodes","auxCode","workTypeCode","active","length","isSystem","isSystemCode","isDefault","defaultCode","getDefaultWrapUpCode","wrapUpReasonList","c","parseAgentConfigs","profileData","userData","teamData","tenantData","orgInfoData","orgSettingsData","urlMapping","aiFeatureFlags","tenantDataTimeout","timeoutDesktopInactivityEnabled","timeoutDesktopInactivityMins","inactivityTimeoutTimer","timeoutDesktopInactivityCustomEnabled","wrapupCodes","WRAP_UP_CODE","accessWrapUpCode","wrapUpCodes","idleCodes","IDLE_CODE","accessIdleCode","defaultWrapUpData","aiFeature","data","undefined","isWellnessConfigured","agentWellbeing","enable","wellnessBreakReminders","WELLNESS_BREAK_REMINDERS_ENABLED","hasAIAssistantLicense","aiAssistantQuantity","finalData","teams","defaultDn","deafultDialledNumber","forceDefaultDn","forceDefaultDnForAgent","regexUS","dnDefaultRegex","regexOther","dnOtherRegex","agentId","ciUserId","agentName","firstName","lastName","agentMailId","email","agentProfileID","agentProfileId","autoAnswer","dialPlan","dialPlanEnabled","dialPlanEntity","dialPlans","multimediaProfileId","skillProfileId","siteId","enterpriseId","tenantId","tenantTimezone","timezone","environment","privacyShieldVisible","organizationIdleCodes","idleCodesAccess","wrapUpData","wrapUpProps","autoWrapup","autoWrapUp","autoWrapupInterval","autoWrapAfterSeconds","lastAgentRoute","lastAgentRouting","wrapUpCodeAccess","allowCancelAutoWrapup","allowAutoWrapUpExtension","defaultWrapupCode","isOutboundEnabledForTenant","outdialEnabled","isOutboundEnabledForAgent","isAdhocDialingEnabled","isAgentAvailableAfterOutdial","agentAvailableAfterOutdial","outDialEp","outdialEntryPointId","isCampaignManagementEnabled","campaignManagerEnabled","isEndTaskEnabled","endCallEnabled","isEndConsultEnabled","endConsultEnabled","callVariablesSuppressed","agentDbId","dbId","allowConsultToQueue","consultToQueue","accessQueue","accessEntryPoint","accessBuddyTeam","agentPersonalStatsEnabled","viewableStatistics","agentStats","addressBookId","outdialANIId","analyserUserId","acqueonApiUrl","acqueonConsoleUrl","isTimeoutDesktopInactivityEnabled","loginVoiceOptions","webRtcEnabled","maskSensitiveData","microsoftConfig","webexConfig","lostConnectionRecoveryTimeout","LOST_CONNECTION_RECOVERY_TIMEOUT","isWellnessBreakEnabled"],"sources":["Util.ts"],"sourcesContent":["import {LOST_CONNECTION_RECOVERY_TIMEOUT} from '../core/constants';\nimport {WELLNESS_BREAK_REMINDERS_ENABLED} from './constants';\nimport {\n AgentResponse,\n AuxCode,\n AuxCodeType,\n DesktopProfileResponse,\n DialPlanEntity,\n Entity,\n IDLE_CODE,\n OrgInfo,\n OrgSettings,\n Profile,\n Team,\n TenantData,\n URLMapping,\n WRAP_UP_CODE,\n AIFeatureFlagsResponse,\n AIFeatureFlags,\n} from './types';\n\n/**\n * Get the URL mapping for the given name\n * @param {Array<URLMapping>} urlMappings\n * @param {string} name\n * @returns {string}\n */\nconst getUrlMapping = (urlMappings: Array<URLMapping>, name: string) => {\n const mappedUrl = urlMappings.find((mapping) => mapping.name === name)?.url;\n\n return mappedUrl || '';\n};\n\n/**\n * Get the MSFT and Webex configuration\n * @param {DesktopProfileResponse} agentProfileData\n * @returns {Object}\n */\nconst getMsftConfig = (agentProfileData: DesktopProfileResponse) => {\n return {\n showUserDetailsMS: agentProfileData.showUserDetailsMS ?? false,\n stateSynchronizationMS: agentProfileData.stateSynchronizationMS ?? false,\n };\n};\n\n/**\n * Get the Webex configuration\n * @param {DesktopProfileResponse} agentProfileData\n * @returns {Object}\n */\nconst getWebexConfig = (agentProfileData: DesktopProfileResponse) => {\n return {\n showUserDetailsWebex: agentProfileData.showUserDetailsWebex ?? false,\n stateSynchronizationWebex: agentProfileData.stateSynchronizationWebex ?? false,\n };\n};\n\n/**\n * Get the default agent DN\n * @param {string} agentDNValidation\n * @returns {boolean}\n */\nconst getDefaultAgentDN = (agentDNValidation: string) => {\n return agentDNValidation === 'PROVISIONED_VALUE';\n};\n\n/**\n * Get the filtered dialplan entries\n * @param {Array<DialPlanEntity>} dialPlanData\n * @param {Array<string>} profileDialPlans\n * @returns {Array<Entity>}\n */\nconst getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[], profileDialPlans: string[]) => {\n const dialPlanEntries = [];\n dialPlanData.forEach((dailPlan: DialPlanEntity) => {\n if (profileDialPlans.includes(dailPlan.id)) {\n const filteredPlan = {\n regex: dailPlan.regularExpression,\n prefix: dailPlan.prefix,\n strippedChars: dailPlan.strippedChars,\n name: dailPlan.name,\n };\n dialPlanEntries.push(filteredPlan);\n }\n });\n\n return dialPlanEntries;\n};\n\n/**\n * Get the filtered aux codes\n * @param {Array<AuxCode>} auxCodes\n * @param {AuxCodeType} type\n * @param {Array<string>} specificCodes\n * @returns {Array<Entity>}\n */\nconst getFilterAuxCodes = (\n auxCodes: Array<AuxCode>,\n type: AuxCodeType,\n specificCodes: string[]\n) => {\n const filteredAuxCodes: Array<Entity> = [];\n auxCodes.forEach((auxCode: AuxCode) => {\n if (\n auxCode.workTypeCode === type &&\n auxCode.active &&\n (specificCodes.length === 0 || specificCodes.includes(auxCode.id))\n ) {\n filteredAuxCodes.push({\n id: auxCode.id,\n name: auxCode.name,\n isSystem: auxCode.isSystemCode,\n isDefault: auxCode.defaultCode,\n });\n }\n });\n\n return filteredAuxCodes;\n};\n\n/**\n * Get the default wrapup code\n * @param {Array<Entity>} wrapUpReasonList\n * @returns {Entity}\n */\nfunction getDefaultWrapUpCode(wrapUpReasonList: Entity[]) {\n return wrapUpReasonList?.find((c: Entity) => c.isDefault);\n}\n\n/**\n * Parse the agent configurations\n * @param {Object} profileData\n * @returns {Profile}\n */\nfunction parseAgentConfigs(profileData: {\n userData: AgentResponse;\n teamData: Team[];\n tenantData: TenantData;\n orgInfoData: OrgInfo;\n auxCodes: AuxCode[];\n orgSettingsData: OrgSettings;\n agentProfileData: DesktopProfileResponse;\n dialPlanData: DialPlanEntity[];\n urlMapping: URLMapping[];\n multimediaProfileId: string;\n aiFeatureFlags: AIFeatureFlagsResponse;\n}): Profile {\n const {\n userData,\n teamData,\n tenantData,\n orgInfoData,\n auxCodes,\n orgSettingsData,\n agentProfileData,\n dialPlanData,\n urlMapping,\n aiFeatureFlags,\n } = profileData;\n\n const tenantDataTimeout = tenantData.timeoutDesktopInactivityEnabled\n ? tenantData.timeoutDesktopInactivityMins\n : null;\n const inactivityTimeoutTimer = agentProfileData.timeoutDesktopInactivityCustomEnabled\n ? agentProfileData.timeoutDesktopInactivityMins\n : tenantDataTimeout;\n\n const wrapupCodes = getFilterAuxCodes(\n auxCodes,\n WRAP_UP_CODE,\n agentProfileData.accessWrapUpCode === 'ALL' ? [] : agentProfileData.wrapUpCodes\n );\n\n const idleCodes = getFilterAuxCodes(\n auxCodes,\n IDLE_CODE,\n agentProfileData.accessIdleCode === 'ALL' ? [] : agentProfileData.idleCodes\n );\n\n idleCodes.push({\n id: '0',\n name: 'Available',\n isSystem: false,\n isDefault: false,\n }); // pushing available state to idle codes\n\n const defaultWrapUpData = getDefaultWrapUpCode(wrapupCodes);\n const aiFeature: AIFeatureFlags | undefined =\n aiFeatureFlags?.data?.length > 0 ? aiFeatureFlags.data[0] : undefined;\n const isWellnessConfigured =\n aiFeature?.agentWellbeing?.enable === true &&\n aiFeature.agentWellbeing.wellnessBreakReminders === WELLNESS_BREAK_REMINDERS_ENABLED;\n const hasAIAssistantLicense = (orgSettingsData.aiAssistantQuantity ?? 0) > 0;\n\n const finalData = {\n teams: teamData,\n defaultDn: userData.deafultDialledNumber,\n forceDefaultDn: tenantData.forceDefaultDn,\n forceDefaultDnForAgent: getDefaultAgentDN(agentProfileData.agentDNValidation),\n regexUS: tenantData.dnDefaultRegex,\n regexOther: tenantData.dnOtherRegex,\n agentId: userData.ciUserId,\n agentName: `${userData.firstName} ${userData.lastName}`,\n agentMailId: userData.email,\n agentProfileID: userData.agentProfileId,\n autoAnswer: agentProfileData.autoAnswer,\n dialPlan: agentProfileData.dialPlanEnabled\n ? {\n type: 'adhocDial',\n dialPlanEntity: getFilteredDialplanEntries(dialPlanData, agentProfileData.dialPlans),\n }\n : undefined,\n multimediaProfileId: profileData.multimediaProfileId,\n skillProfileId: userData.skillProfileId ? userData.skillProfileId : null,\n siteId: userData.siteId,\n enterpriseId: orgInfoData.tenantId,\n tenantTimezone: orgInfoData.timezone,\n environment: orgInfoData.environment,\n privacyShieldVisible: tenantData.privacyShieldVisible,\n organizationIdleCodes: [], // TODO: for supervisor, getOrgFilteredIdleCodes(auxCodes, false),\n idleCodesAccess: agentProfileData.accessIdleCode as 'ALL' | 'SPECIFIC',\n idleCodes,\n wrapupCodes,\n wrapUpData: {\n wrapUpProps: {\n autoWrapup: agentProfileData.autoWrapUp,\n autoWrapupInterval: agentProfileData.autoWrapAfterSeconds,\n lastAgentRoute: agentProfileData.lastAgentRouting,\n wrapUpCodeAccess: agentProfileData.accessWrapUpCode,\n wrapUpReasonList: wrapupCodes,\n allowCancelAutoWrapup: agentProfileData.allowAutoWrapUpExtension,\n },\n },\n defaultWrapupCode: defaultWrapUpData?.id ?? '',\n isOutboundEnabledForTenant: tenantData.outdialEnabled,\n isOutboundEnabledForAgent: agentProfileData.outdialEnabled,\n isAdhocDialingEnabled: agentProfileData.dialPlanEnabled,\n isAgentAvailableAfterOutdial: agentProfileData.agentAvailableAfterOutdial,\n outDialEp: agentProfileData.outdialEntryPointId,\n isCampaignManagementEnabled: orgSettingsData.campaignManagerEnabled,\n isEndTaskEnabled: tenantData.endCallEnabled,\n isEndConsultEnabled: tenantData.endConsultEnabled,\n callVariablesSuppressed: tenantData.callVariablesSuppressed,\n agentDbId: userData.dbId,\n allowConsultToQueue: agentProfileData.consultToQueue,\n accessQueue: agentProfileData.accessQueue,\n accessEntryPoint: agentProfileData.accessEntryPoint,\n accessBuddyTeam: agentProfileData.accessBuddyTeam,\n agentPersonalStatsEnabled: agentProfileData.viewableStatistics\n ? agentProfileData.viewableStatistics.agentStats\n : false,\n addressBookId: agentProfileData.addressBookId,\n outdialANIId: agentProfileData.outdialANIId,\n analyserUserId: userData.id,\n\n urlMappings: {\n acqueonApiUrl: getUrlMapping(urlMapping, 'ACQUEON_API_URL'),\n acqueonConsoleUrl: getUrlMapping(urlMapping, 'ACQUEON_CONSOLE_URL'),\n },\n isTimeoutDesktopInactivityEnabled: tenantData.timeoutDesktopInactivityEnabled,\n timeoutDesktopInactivityMins: inactivityTimeoutTimer,\n loginVoiceOptions: agentProfileData.loginVoiceOptions ?? [],\n webRtcEnabled: orgSettingsData.webRtcEnabled,\n maskSensitiveData: orgSettingsData.maskSensitiveData\n ? orgSettingsData.maskSensitiveData\n : false,\n microsoftConfig: getMsftConfig(agentProfileData),\n webexConfig: getWebexConfig(agentProfileData),\n lostConnectionRecoveryTimeout:\n tenantData.lostConnectionRecoveryTimeout || LOST_CONNECTION_RECOVERY_TIMEOUT,\n aiFeature,\n isWellnessBreakEnabled: isWellnessConfigured && hasAIAssistantLicense,\n };\n\n return finalData;\n}\n\nexport {parseAgentConfigs};\n"],"mappings":"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","ignoreList":[]}
@@ -3,10 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.endPointMap = exports.METHODS = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE = exports.DEFAULT_AUXCODE_ATTRIBUTES = exports.AGENT_STATE_AVAILABLE_ID = exports.AGENT_STATE_AVAILABLE_DESCRIPTION = exports.AGENT_STATE_AVAILABLE = void 0;
6
+ exports.endPointMap = exports.WELLNESS_BREAK_REMINDERS_ENABLED = exports.WELLBEING_BREAK_IDLE_CODE = exports.METHODS = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE = exports.DEFAULT_AUXCODE_ATTRIBUTES = exports.COLLABORATION_ACCESS = exports.AGENT_STATE_AVAILABLE_ID = exports.AGENT_STATE_AVAILABLE_DESCRIPTION = exports.AGENT_STATE_AVAILABLE = void 0;
7
7
  // making query params configurable for List Teams and List Aux Codes API
8
8
  const DEFAULT_PAGE = exports.DEFAULT_PAGE = 0;
9
9
 
10
+ /** Desktop Profile access levels for collaboration destination categories. */
11
+ const COLLABORATION_ACCESS = exports.COLLABORATION_ACCESS = {
12
+ ALL: 'ALL',
13
+ SPECIFIC: 'SPECIFIC',
14
+ NONE: 'NONE'
15
+ };
16
+
10
17
  /**
11
18
  * Default page size for paginated API requests.
12
19
  * @type {number}
@@ -33,6 +40,12 @@ const AGENT_STATE_AVAILABLE_ID = exports.AGENT_STATE_AVAILABLE_ID = '0';
33
40
  */
34
41
  const AGENT_STATE_AVAILABLE = exports.AGENT_STATE_AVAILABLE = 'Available';
35
42
 
43
+ /** System idle-code name reserved for Agent Wellness Break. */
44
+ const WELLBEING_BREAK_IDLE_CODE = exports.WELLBEING_BREAK_IDLE_CODE = 'WellbeingBreak';
45
+
46
+ /** Backend sentinel indicating wellness-break reminders are enabled. @internal */
47
+ const WELLNESS_BREAK_REMINDERS_ENABLED = exports.WELLNESS_BREAK_REMINDERS_ENABLED = 'ENABLED';
48
+
36
49
  /**
37
50
  * Description for the 'Available' agent state.
38
51
  * @type {string}
@@ -67,6 +80,7 @@ const METHODS = exports.METHODS = {
67
80
  GET_URL_MAPPING: 'getURLMapping',
68
81
  GET_DIAL_PLAN_DATA: 'getDialPlanData',
69
82
  GET_AI_FEATURE_FLAGS: 'getAIFeatureFlags',
83
+ GET_WELLBEING_BREAK_IDLE_CODE: 'getWellbeingBreakIdleCode',
70
84
  GET_QUEUES: 'getQueues',
71
85
  // Util methods
72
86
  PARSE_AGENT_CONFIGS: 'parseAgentConfigs',
@@ -146,6 +160,8 @@ const endPointMap = exports.endPointMap = {
146
160
  * @ignore
147
161
  */
148
162
  listAuxCodes: (orgId, page, pageSize, filter, attributes) => `organization/${orgId}/v2/auxiliary-code?page=${page}&pageSize=${pageSize}${filter && filter.length > 0 ? `&filter=id=in=(${filter})` : ''}&attributes=${attributes}&desktopProfileFilter=true`,
163
+ /** Lists system idle codes without applying the agent Desktop Profile filter. */
164
+ systemIdleCodes: (orgId, page, pageSize) => `organization/${orgId}/v2/auxiliary-code?page=${page}&pageSize=${pageSize}` + '&workType=IDLE_CODE&customFilter=isSystemCode==true&desktopProfileFilter=false',
149
165
  /**
150
166
  * Gets the endpoint for organization info.
151
167
  * @param orgId - Organization ID.
@@ -229,16 +245,13 @@ const endPointMap = exports.endPointMap = {
229
245
  */
230
246
  queueList: (orgId, queryParams) => `/organization/${orgId}/v2/contact-service-queue?${queryParams}`,
231
247
  /**
232
- * Gets the endpoint for entry points list with custom query parameters.
248
+ * Gets the desktop-profile-filtered dial-number mappings used by entry-point destination lists.
233
249
  * @param orgId - Organization ID.
234
250
  * @param queryParams - Query parameters string.
235
251
  * @returns The endpoint URL string.
236
- * @public
237
- * @example
238
- * const url = endPointMap.entryPointList('org123', 'page=0&pageSize=10');
239
252
  * @ignore
240
253
  */
241
- entryPointList: (orgId, queryParams) => `/organization/${orgId}/v2/entry-point?${queryParams}`,
254
+ entryPointDialNumberList: (orgId, queryParams) => `/organization/${orgId}/v3/dial-number?${queryParams}`,
242
255
  /**
243
256
  * Gets the endpoint for address book entries with custom query parameters.
244
257
  * @param orgId - Organization ID.
@@ -262,6 +275,27 @@ const endPointMap = exports.endPointMap = {
262
275
  * const url = endPointMap.outdialAniEntries('org123', 'ani456', 'page=0&pageSize=10');
263
276
  * @ignore
264
277
  */
265
- outdialAniEntries: (orgId, outdialANI, queryParams) => `organization/${orgId}/v2/outdial-ani/${outdialANI}/entry${queryParams ? `?${queryParams}` : ''}`
278
+ outdialAniEntries: (orgId, outdialANI, queryParams) => `organization/${orgId}/v2/outdial-ani/${outdialANI}/entry${queryParams ? `?${queryParams}` : ''}`,
279
+ /**
280
+ * Gets the endpoint for user preference by user ID.
281
+ * @param orgId - Organization ID.
282
+ * @param userId - User ID.
283
+ * @returns The endpoint URL string.
284
+ * @public
285
+ * @example
286
+ * const url = endPointMap.userPreference('org123', 'user456');
287
+ * @ignore
288
+ */
289
+ userPreference: (orgId, userId) => `organization/${orgId}/user-preference/${userId}`,
290
+ /**
291
+ * Gets the endpoint for creating user preference.
292
+ * @param orgId - Organization ID.
293
+ * @returns The endpoint URL string.
294
+ * @public
295
+ * @example
296
+ * const url = endPointMap.userPreferenceCreate('org123');
297
+ * @ignore
298
+ */
299
+ userPreferenceCreate: orgId => `organization/${orgId}/user-preference`
266
300
  };
267
301
  //# sourceMappingURL=constants.js.map