@webex/contact-center 3.11.0 → 3.12.0-auth-prejoin-fetch.1

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 (325) hide show
  1. package/.sdd/manifest.json +883 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +50 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +359 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  19. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  20. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  21. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  22. package/ai-docs/patterns/testing-patterns.md +480 -0
  23. package/ai-docs/patterns/typescript-patterns.md +365 -0
  24. package/ai-docs/templates/README.md +102 -0
  25. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  26. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  27. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  28. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  29. package/ai-docs/templates/new-method/00-master.md +80 -0
  30. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  31. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  32. package/ai-docs/templates/new-method/03-tests.md +201 -0
  33. package/ai-docs/templates/new-method/04-validation.md +141 -0
  34. package/ai-docs/templates/new-service/00-master.md +109 -0
  35. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  36. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  37. package/ai-docs/templates/new-service/03-integration.md +178 -0
  38. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  39. package/ai-docs/templates/new-service/05-validation.md +145 -0
  40. package/dist/cc.js +818 -59
  41. package/dist/cc.js.map +1 -1
  42. package/dist/config.js +13 -0
  43. package/dist/config.js.map +1 -1
  44. package/dist/constants.js +31 -3
  45. package/dist/constants.js.map +1 -1
  46. package/dist/index.js +27 -5
  47. package/dist/index.js.map +1 -1
  48. package/dist/metrics/behavioral-events.js +127 -0
  49. package/dist/metrics/behavioral-events.js.map +1 -1
  50. package/dist/metrics/constants.js +34 -3
  51. package/dist/metrics/constants.js.map +1 -1
  52. package/dist/services/AddressBook.js +18 -15
  53. package/dist/services/AddressBook.js.map +1 -1
  54. package/dist/services/AnswerCallOnWebexService.js +174 -0
  55. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  56. package/dist/services/ApiAiAssistant.js +318 -0
  57. package/dist/services/ApiAiAssistant.js.map +1 -0
  58. package/dist/services/EntryPoint.js +46 -68
  59. package/dist/services/EntryPoint.js.map +1 -1
  60. package/dist/services/Queue.js +27 -22
  61. package/dist/services/Queue.js.map +1 -1
  62. package/dist/services/UserPreference.js +427 -0
  63. package/dist/services/UserPreference.js.map +1 -0
  64. package/dist/services/WebexCrossClientService.js +171 -0
  65. package/dist/services/WebexCrossClientService.js.map +1 -0
  66. package/dist/services/WxAppTelephonyMercurySync.js +93 -0
  67. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  68. package/dist/services/agent/types.js.map +1 -1
  69. package/dist/services/config/Util.js +11 -4
  70. package/dist/services/config/Util.js.map +1 -1
  71. package/dist/services/config/constants.js +45 -8
  72. package/dist/services/config/constants.js.map +1 -1
  73. package/dist/services/config/index.js +41 -2
  74. package/dist/services/config/index.js.map +1 -1
  75. package/dist/services/config/types.js +70 -8
  76. package/dist/services/config/types.js.map +1 -1
  77. package/dist/services/constants.js +27 -1
  78. package/dist/services/constants.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +122 -25
  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 +119 -30
  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 +22 -6
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/connection-service.js +3 -1
  90. package/dist/services/core/websocket/connection-service.js.map +1 -1
  91. package/dist/services/core/websocket/types.js.map +1 -1
  92. package/dist/services/index.js +6 -0
  93. package/dist/services/index.js.map +1 -1
  94. package/dist/services/task/Task.js +754 -0
  95. package/dist/services/task/Task.js.map +1 -0
  96. package/dist/services/task/TaskFactory.js +49 -0
  97. package/dist/services/task/TaskFactory.js.map +1 -0
  98. package/dist/services/task/TaskManager.js +1073 -447
  99. package/dist/services/task/TaskManager.js.map +1 -1
  100. package/dist/services/task/TaskUtils.js +220 -23
  101. package/dist/services/task/TaskUtils.js.map +1 -1
  102. package/dist/services/task/WebexCallingUtils.js +70 -0
  103. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  104. package/dist/services/task/constants.js +26 -2
  105. package/dist/services/task/constants.js.map +1 -1
  106. package/dist/services/task/contact.js +29 -0
  107. package/dist/services/task/contact.js.map +1 -1
  108. package/dist/services/task/dialer.js +129 -0
  109. package/dist/services/task/dialer.js.map +1 -1
  110. package/dist/services/task/digital/Digital.js +78 -0
  111. package/dist/services/task/digital/Digital.js.map +1 -0
  112. package/dist/services/task/state-machine/TaskStateMachine.js +971 -0
  113. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  114. package/dist/services/task/state-machine/actions.js +572 -0
  115. package/dist/services/task/state-machine/actions.js.map +1 -0
  116. package/dist/services/task/state-machine/constants.js +161 -0
  117. package/dist/services/task/state-machine/constants.js.map +1 -0
  118. package/dist/services/task/state-machine/guards.js +409 -0
  119. package/dist/services/task/state-machine/guards.js.map +1 -0
  120. package/dist/services/task/state-machine/index.js +53 -0
  121. package/dist/services/task/state-machine/index.js.map +1 -0
  122. package/dist/services/task/state-machine/types.js +54 -0
  123. package/dist/services/task/state-machine/types.js.map +1 -0
  124. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  125. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  126. package/dist/services/task/taskDataNormalizer.js +99 -0
  127. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  128. package/dist/services/task/types.js +243 -5
  129. package/dist/services/task/types.js.map +1 -1
  130. package/dist/services/task/voice/Voice.js +1380 -0
  131. package/dist/services/task/voice/Voice.js.map +1 -0
  132. package/dist/services/task/voice/WebRTC.js +152 -0
  133. package/dist/services/task/voice/WebRTC.js.map +1 -0
  134. package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
  135. package/dist/services/task/voice/wxAppVoiceMethods.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 +967 -0
  139. package/dist/types/config.d.ts +79 -0
  140. package/dist/types/constants.d.ts +74 -0
  141. package/dist/types/index.d.ts +201 -0
  142. package/dist/types/logger-proxy.d.ts +71 -0
  143. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  144. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  145. package/dist/types/metrics/constants.d.ts +183 -0
  146. package/dist/types/services/AddressBook.d.ts +75 -0
  147. package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
  148. package/dist/types/services/ApiAiAssistant.d.ts +49 -0
  149. package/dist/types/services/EntryPoint.d.ts +69 -0
  150. package/dist/types/services/Queue.d.ts +78 -0
  151. package/dist/types/services/UserPreference.d.ts +118 -0
  152. package/dist/types/services/WebCallingService.d.ts +1 -0
  153. package/dist/types/services/WebexCrossClientService.d.ts +28 -0
  154. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  155. package/dist/types/services/agent/index.d.ts +46 -0
  156. package/dist/types/services/agent/types.d.ts +413 -0
  157. package/dist/types/services/config/Util.d.ts +20 -0
  158. package/dist/types/services/config/constants.d.ts +273 -0
  159. package/dist/types/services/config/index.d.ts +177 -0
  160. package/dist/types/services/config/types.d.ts +1381 -0
  161. package/dist/types/services/constants.d.ts +110 -0
  162. package/dist/types/services/core/Err.d.ts +127 -0
  163. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  164. package/dist/types/services/core/Utils.d.ts +121 -0
  165. package/dist/types/services/core/WebexRequest.d.ts +23 -0
  166. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  167. package/dist/types/services/core/constants.d.ts +99 -0
  168. package/dist/types/services/core/types.d.ts +49 -0
  169. package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
  170. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  171. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  172. package/dist/types/services/core/websocket/types.d.ts +37 -0
  173. package/dist/types/services/index.d.ts +54 -0
  174. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  175. package/dist/types/services/task/Task.d.ts +175 -0
  176. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  177. package/dist/types/services/task/TaskManager.d.ts +1 -0
  178. package/dist/types/services/task/TaskUtils.d.ts +138 -0
  179. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  180. package/dist/types/services/task/constants.d.ts +94 -0
  181. package/dist/types/services/task/contact.d.ts +73 -0
  182. package/dist/types/services/task/dialer.d.ts +73 -0
  183. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  184. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1398 -0
  185. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  186. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  187. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  188. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  189. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  190. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  191. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  192. package/dist/types/services/task/types.d.ts +1933 -0
  193. package/dist/types/services/task/voice/Voice.d.ts +223 -0
  194. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  195. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
  196. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  197. package/dist/types/types.d.ts +784 -0
  198. package/dist/types/utils/PageCache.d.ts +190 -0
  199. package/dist/types/webex-config.d.ts +53 -0
  200. package/dist/types/webex.d.ts +8 -0
  201. package/dist/types.js +137 -3
  202. package/dist/types.js.map +1 -1
  203. package/dist/utils/PageCache.js +19 -5
  204. package/dist/utils/PageCache.js.map +1 -1
  205. package/dist/webex.js +14 -2
  206. package/dist/webex.js.map +1 -1
  207. package/package.json +16 -12
  208. package/src/cc.ts +983 -60
  209. package/src/config.ts +13 -0
  210. package/src/constants.ts +29 -1
  211. package/src/index.ts +26 -5
  212. package/src/metrics/ai-docs/AGENTS.md +350 -0
  213. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  214. package/src/metrics/ai-docs/metrics-spec.md +860 -0
  215. package/src/metrics/behavioral-events.ts +134 -0
  216. package/src/metrics/constants.ts +39 -3
  217. package/src/services/AddressBook.ts +17 -6
  218. package/src/services/AnswerCallOnWebexService.ts +206 -0
  219. package/src/services/ApiAiAssistant.ts +412 -0
  220. package/src/services/EntryPoint.ts +59 -60
  221. package/src/services/Queue.ts +29 -12
  222. package/src/services/UserPreference.ts +509 -0
  223. package/src/services/WebexCrossClientService.ts +212 -0
  224. package/src/services/WxAppTelephonyMercurySync.ts +115 -0
  225. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  226. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  227. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  228. package/src/services/agent/types.ts +1 -1
  229. package/src/services/ai-docs/AGENTS.md +386 -0
  230. package/src/services/ai-docs/services-spec.md +497 -0
  231. package/src/services/config/Util.ts +13 -2
  232. package/src/services/config/ai-docs/AGENTS.md +255 -0
  233. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  234. package/src/services/config/ai-docs/config-spec.md +675 -0
  235. package/src/services/config/constants.ts +47 -7
  236. package/src/services/config/index.ts +45 -1
  237. package/src/services/config/types.ts +253 -11
  238. package/src/services/constants.ts +29 -0
  239. package/src/services/core/Err.ts +4 -0
  240. package/src/services/core/Utils.ts +143 -30
  241. package/src/services/core/WebexRequest.ts +3 -1
  242. package/src/services/core/ai-docs/AGENTS.md +381 -0
  243. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  244. package/src/services/core/ai-docs/core-spec.md +787 -0
  245. package/src/services/core/aqm-reqs.ts +125 -32
  246. package/src/services/core/types.ts +2 -0
  247. package/src/services/core/websocket/WebSocketManager.ts +23 -6
  248. package/src/services/core/websocket/connection-service.ts +5 -1
  249. package/src/services/core/websocket/types.ts +1 -1
  250. package/src/services/index.ts +4 -0
  251. package/src/services/task/Task.ts +908 -0
  252. package/src/services/task/TaskFactory.ts +60 -0
  253. package/src/services/task/TaskManager.ts +1291 -513
  254. package/src/services/task/TaskUtils.ts +314 -24
  255. package/src/services/task/WebexCallingUtils.ts +136 -0
  256. package/src/services/task/ai-docs/AGENTS.md +457 -0
  257. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  258. package/src/services/task/ai-docs/task-spec.md +1469 -0
  259. package/src/services/task/constants.ts +26 -0
  260. package/src/services/task/contact.ts +30 -0
  261. package/src/services/task/dialer.ts +136 -1
  262. package/src/services/task/digital/Digital.ts +97 -0
  263. package/src/services/task/state-machine/TaskStateMachine.ts +1313 -0
  264. package/src/services/task/state-machine/actions.ts +741 -0
  265. package/src/services/task/state-machine/ai-docs/AGENTS.md +462 -0
  266. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1146 -0
  267. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2209 -0
  268. package/src/services/task/state-machine/constants.ts +172 -0
  269. package/src/services/task/state-machine/guards.ts +498 -0
  270. package/src/services/task/state-machine/index.ts +28 -0
  271. package/src/services/task/state-machine/types.ts +258 -0
  272. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  273. package/src/services/task/taskDataNormalizer.ts +137 -0
  274. package/src/services/task/types.ts +843 -70
  275. package/src/services/task/voice/Voice.ts +1720 -0
  276. package/src/services/task/voice/WebRTC.ts +191 -0
  277. package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
  278. package/src/services/wxAppTelephonyUtils.ts +14 -0
  279. package/src/types.ts +238 -11
  280. package/src/utils/AGENTS.md +289 -0
  281. package/src/utils/PageCache.ts +38 -5
  282. package/src/utils/ai-docs/utils-spec.md +391 -0
  283. package/src/webex.js +2 -0
  284. package/test/unit/spec/cc.ts +1856 -122
  285. package/test/unit/spec/logger-proxy.ts +70 -0
  286. package/test/unit/spec/metrics/behavioral-events.ts +18 -0
  287. package/test/unit/spec/services/AddressBook.ts +37 -6
  288. package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
  289. package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
  290. package/test/unit/spec/services/EntryPoint.ts +87 -40
  291. package/test/unit/spec/services/Queue.ts +123 -12
  292. package/test/unit/spec/services/UserPreference.ts +401 -0
  293. package/test/unit/spec/services/WebCallingService.ts +7 -1
  294. package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
  295. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
  296. package/test/unit/spec/services/config/Util.ts +85 -0
  297. package/test/unit/spec/services/config/index.ts +85 -29
  298. package/test/unit/spec/services/core/Utils.ts +481 -2
  299. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  300. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  301. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
  302. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  303. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  304. package/test/unit/spec/services/task/Task.ts +677 -0
  305. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  306. package/test/unit/spec/services/task/TaskManager.ts +2209 -918
  307. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  308. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  309. package/test/unit/spec/services/task/contact.ts +33 -0
  310. package/test/unit/spec/services/task/dialer.ts +372 -96
  311. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  312. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +3433 -0
  313. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  314. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  315. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  316. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  317. package/test/unit/spec/services/task/voice/Voice.ts +1523 -0
  318. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  319. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -0
  320. package/umd/contact-center.min.js +2 -2
  321. package/umd/contact-center.min.js.map +1 -1
  322. package/dist/services/task/index.js +0 -1525
  323. package/dist/services/task/index.js.map +0 -1
  324. package/src/services/task/index.ts +0 -1801
  325. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,497 @@
1
+ # Services — SPEC
2
+
3
+ > Start here → root [`AGENTS.md`](../../../AGENTS.md) · router [`SPEC_INDEX.md`](../../../ai-docs/SPEC_INDEX.md) · system [`ARCHITECTURE.md`](../../../ai-docs/ARCHITECTURE.md). This is the module's canonical specification.
4
+
5
+ ## Metadata
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Module id | `services` |
10
+ | Source path(s) | `src/services` |
11
+ | Doc kind | Module spec |
12
+ | Coverage score | Partial (manifest-authoritative); 15/15 required document fields present |
13
+ | Generated from | `module-spec` @ SDLC template library `0.2.1` |
14
+ | generated_by / approved_by / updated_at | Codex generator / developer-approved follow-up review remediation / 2026-07-21 |
15
+ | Validation status | Follow-up validation passed (independent Claude fallback, 2026-07-21); coverage remains Partial |
16
+
17
+ ## Evidence Rules
18
+ Every requirement cites stable source and test file paths. Code/tests are the behavioral referee; routed source text supplies explicit intent and rationale. Missing or contradictory evidence blocks promotion.
19
+
20
+ ## Source Material Register
21
+ | Source material | Scope | Decision | Detail location or disposition |
22
+ |---|---|---|---|
23
+ | Reviewed prior module guides and architecture material | overview / architecture / API / tests | used and code-checked | Content is placed by meaning throughout this specification; exact routing remains in the manifest. |
24
+
25
+ ## Overview
26
+ Services is one of nine confirmed Contact Center SDK modules. Own composition and bootstrap order for backend request, realtime, data, and WebRTC service collaborators. Existing reviewed documentation is migrated by meaning and code/tests remain the behavioral referee.
27
+
28
+ The `src/services/` directory is the service layer of the `@webex/contact-center` SDK. It sits between the public plugin class (`cc.ts`) and the backend APIs/WebSocket. Every backend interaction — HTTP requests, WebSocket messages, agent operations, task lifecycle, configuration fetching — flows through this layer.
29
+
30
+ - Understanding service composition and which service owns which responsibility
31
+
32
+ - Determining the correct instantiation/bootstrap order for services
33
+
34
+ - Tracing request flow from `cc.ts` through services to the backend
35
+
36
+ - Choosing between AqmReqs and direct REST patterns for a new method
37
+
38
+ - Adding a new paginated data service (AddressBook/Queue/EntryPoint pattern) or a direct REST service such as UserPreference
39
+
40
+ - Adding a new AqmReqs method to agent, task, or dialer factories
41
+
42
+ - Routing to the correct service-level docs for task/agent/config/core changes
43
+
44
+ - Clarifying what the Services singleton creates vs what `cc.ts` creates
45
+
46
+ | Capability | Owner | Description |
47
+ |---|---|---|
48
+ | **Service Singleton** | [`index.ts`](../index.ts) | Central `Services` class that instantiates and provides access to all service modules via `Services.getInstance()` |
49
+ | **Agent Operations** | [`agent/`](../agent/index.ts) | Station login/logout, state changes, buddy agents — uses AqmReqs factory pattern |
50
+ | **Task Management** | [`task/`](../task/TaskManager.ts) | Task lifecycle (accept, hold, transfer, conference, wrapup), Task state machine, contact operations, outbound dialing |
51
+ | **Configuration** | [`config/`](../config/index.ts) | Agent profile aggregation from 8+ API endpoints, org settings, teams, aux codes, dial plans |
52
+ | **Core Infrastructure** | [`core/`](../core/WebexRequest.ts) | HTTP requests (`WebexRequest`), WebSocket management (`WebSocketManager`), connection lifecycle (`ConnectionService`), AQM request/response correlation (`AqmReqs`), error handling (`Utils`, `Err`) |
53
+ | **Data Services** | [`AddressBook.ts`](../AddressBook.ts), [`Queue.ts`](../Queue.ts), [`EntryPoint.ts`](../EntryPoint.ts) | Standalone REST-based data services with pagination and caching for address books, queues, and entry points |
54
+ | **User Preferences** | [`UserPreference.ts`](../UserPreference.ts) | Direct REST CRUD service exposed as `cc.userPreference`; it resolves the default user from agent configuration and does not use PageCache |
55
+ | **Utilities** | [`src/utils/PageCache.ts`](../../utils/PageCache.ts) | Shared `PageCache<T>` generic class for pagination caching, plus `BaseSearchParams`, `PaginatedResponse`, and `PaginationMeta` types used by all data services |
56
+ | **WebRTC Calling** | [`WebCallingService.ts`](../WebCallingService.ts) | Browser-based voice calling via `@webex/calling`, line registration, call answer/mute/decline |
57
+ | **WxApp Better Together** | [`WebexCrossClientService.ts`](../WebexCrossClientService.ts), [`AnswerCallOnWebexService.ts`](../AnswerCallOnWebexService.ts), [`WxAppTelephonyMercurySync.ts`](../WxAppTelephonyMercurySync.ts) | usersub cross-client publish (`answer-calls-on-wxcc`), Hydra telephony REST (answer/reject/mute/DTMF/GET call), Mercury mute sync — orchestrated from `cc.ts` when `enableWxBetterTogether` is active |
58
+
59
+ Each service folder contains its own `ai-docs/` with detailed documentation. **Always load the relevant service docs before making changes.**
60
+
61
+ | Service | Scope / Keywords | AGENTS.md | ARCHITECTURE.md |
62
+ |---|---|---|---|
63
+ | **Agent** | login, logout, state change, buddy agents, station, RONA | [`agent/ai-docs/agent-spec.md`](../agent/ai-docs/agent-spec.md) | [`agent/ai-docs/agent-spec.md`](../agent/ai-docs/agent-spec.md) |
64
+ | **Task** | task, hold, transfer, conference, wrapup, outdial, consult, accept, decline, state machine, XState, task states, guards, actions | [`task/ai-docs/task-spec.md`](../task/ai-docs/task-spec.md) | [`task/ai-docs/task-spec.md`](../task/ai-docs/task-spec.md) |
65
+ | **Config** | profile, register, teams, aux codes, desktop profile, org settings, dial plan | [`config/ai-docs/config-spec.md`](../config/ai-docs/config-spec.md) | [`config/ai-docs/config-spec.md`](../config/ai-docs/config-spec.md) |
66
+ | **Core** | websocket, HTTP, connection, reconnect, aqm, utils, errors, keepalive | [`core/ai-docs/core-spec.md`](../core/ai-docs/core-spec.md) | [`core/ai-docs/core-spec.md`](../core/ai-docs/core-spec.md) |
67
+
68
+ > **Note**: The task state machine (`task/state-machine/`) is part of the Task service, not a separate service. Its dedicated docs live at [`task/state-machine/ai-docs/task-state-machine-spec.md`](../task/state-machine/ai-docs/task-state-machine-spec.md) and [`ARCHITECTURE.md`](../task/state-machine/ai-docs/task-state-machine-spec.md). Load these when working on state transitions, guards, or actions.
69
+
70
+ **Paginated data services** (AddressBook, Queue, EntryPoint) do not have dedicated ai-docs. Read their source files directly — they follow shared REST/pagination/caching patterns documented in [`ai-docs/patterns/typescript-patterns.md`](../../../ai-docs/patterns/typescript-patterns.md). `UserPreference` is also a direct REST service, but it has CRUD semantics and does not use their PageCache pattern.
71
+
72
+ **WebCallingService** also has no dedicated ai-docs, but it follows a different pattern: EventEmitter-based call lifecycle orchestration around `@webex/calling` (`createClient`, line registration/deregistration, `ICall` events), `callTaskMap` tracking, and async registration flows with timeout handling. Read [`WebCallingService.ts`](../WebCallingService.ts) directly when changing browser calling behavior.
73
+
74
+ The `ContactCenter` plugin class (`cc.ts`) is the **only public entry point**. It delegates all backend work to the services layer:
75
+
76
+ ```text
77
+ ContactCenter (cc.ts) — public API surface
78
+ │
79
+ ├── WebexRequest.getInstance({webex}) ← initialized FIRST (singleton)
80
+ ├── Services.getInstance({webex, connectionConfig}) ← initialized SECOND (singleton)
81
+ │ │
82
+ │ ├── webSocketManager ← primary Contact Center WebSocket transport
83
+ │ ├── rtdWebSocketManager ← separate RTD/transcription WebSocket transport
84
+ │ ├── AqmReqs ← HTTP request + WebSocket notification correlation
85
+ │ ├── ConnectionService ← WebSocket lifecycle, reconnection, keepalive
86
+ │ ├── AgentConfigService (config) ← profile aggregation via REST APIs
87
+ │ ├── routingAgent (agent) ← agent operations via AqmReqs factory
88
+ │ ├── routingContact (contact) ← task/contact operations via AqmReqs factory
89
+ │ └── aqmDialer (dialer) ← outbound dialing via AqmReqs factory
90
+ │
91
+ ├── TaskManager ← task lifecycle, created in the Webex READY callback
92
+ ├── WebCallingService ← WebRTC calling, created in READY (line registration remains conditional)
93
+ ├── ApiAIAssistant ← AI transcript/suggestion API, created in READY
94
+ ├── AddressBook ← REST data service, created in READY
95
+ ├── EntryPoint ← REST data service, created in READY
96
+ ├── Queue ← REST data service, created in READY
97
+ ├── UserPreference ← REST user-preference CRUD service, created in READY
98
+ └── MetricsManager.getInstance({webex}) ← telemetry singleton
99
+ ```
100
+
101
+ ## Purpose / Responsibility
102
+ Own composition and bootstrap order for backend request, realtime, data, and WebRTC service collaborators.
103
+
104
+ ## Stack
105
+ TypeScript 5.4, singleton composition, REST/WebSocket/AQM integrations, @webex/calling, Jest 27.
106
+
107
+ ## Folder / Package Structure
108
+ ```text
109
+ src/services/
110
+ ├── AddressBook.ts
111
+ ├── ApiAiAssistant.ts
112
+ ├── EntryPoint.ts
113
+ ├── Queue.ts
114
+ ├── UserPreference.ts
115
+ ├── WebCallingService.ts
116
+ ├── agent/
117
+ ├── config/
118
+ ├── constants.ts
119
+ ├── core/
120
+ ├── index.ts
121
+ ├── task/
122
+ ```
123
+
124
+ ```text
125
+ src/services/
126
+ ├── index.ts # Services singleton — composes all services
127
+ ├── constants.ts # Shared constants (gateway id, API paths, WebRTC domains/prefixes, timeout, method-name constants)
128
+ ├── ai-docs/
129
+ │ └── AGENTS.md # Preserved legacy migration source (non-canonical)
130
+ │
131
+ ├── agent/ # Agent operations service
132
+ │ ├── index.ts # routingAgent factory — stationLogin, stateChange, logout, buddyAgents
133
+ │ ├── types.ts # Agent types: StateChange, Logout, AGENT_EVENTS, LoginOption
134
+ │ └── ai-docs/ # Agent-specific documentation
135
+ │ ├── AGENTS.md
136
+ │ └── ARCHITECTURE.md
137
+ │
138
+ ├── task/ # Task management service
139
+ │ ├── TaskManager.ts # Task lifecycle manager — creates/destroys Task instances
140
+ │ ├── Task.ts # Individual task — hold, transfer, conference, wrapup
141
+ │ ├── TaskFactory.ts # Creates Task with config flags
142
+ │ ├── contact.ts # routingContact factory — task operations via AqmReqs
143
+ │ ├── dialer.ts # aqmDialer factory — outbound dialing
144
+ │ ├── AutoWrapup.ts # Auto wrapup timer handler
145
+ │ ├── TaskUtils.ts # Task utility functions
146
+ │ ├── taskDataNormalizer.ts # Normalizes task data from events
147
+ │ ├── types.ts # Task types: ITask, TASK_EVENTS, TaskResponse
148
+ │ ├── constants.ts # Task constants
149
+ │ ├── voice/ # Voice-specific task handling
150
+ │ │ ├── Voice.ts # Voice task operations
151
+ │ │ └── WebRTC.ts # WebRTC-specific voice operations
152
+ │ ├── digital/ # Digital channel task handling
153
+ │ │ └── Digital.ts # Digital task operations
154
+ │ ├── state-machine/ # XState-based task state machine
155
+ │ │ ├── TaskStateMachine.ts # State machine definition
156
+ │ │ ├── index.ts # Barrel export for state machine public API
157
+ │ │ ├── constants.ts # TaskState, TaskEvent enums
158
+ │ │ ├── types.ts # TaskContext type
159
+ │ │ ├── guards.ts # State transition guards
160
+ │ │ ├── actions.ts # State transition actions
161
+ │ │ ├── uiControlsComputer.ts # Computes UI controls from state
162
+ │ │ └── ai-docs/ # State machine documentation
163
+ │ │ ├── AGENTS.md
164
+ │ │ └── ARCHITECTURE.md
165
+ │ └── ai-docs/ # Task-specific documentation
166
+ │ ├── AGENTS.md
167
+ │ └── ARCHITECTURE.md
168
+ │
169
+ ├── config/ # Configuration service
170
+ │ ├── index.ts # AgentConfigService — getAgentConfig(), profile aggregation
171
+ │ ├── Util.ts # parseAgentConfigs, getFilterAuxCodes, helper functions
172
+ │ ├── types.ts # CC_EVENTS, Profile, CC_AGENT_EVENTS, CC_TASK_EVENTS
173
+ │ ├── constants.ts # endPointMap (API URL builders), pagination defaults
174
+ │ └── ai-docs/ # Config-specific documentation
175
+ │ ├── AGENTS.md
176
+ │ └── ARCHITECTURE.md
177
+ │
178
+ ├── core/ # Core infrastructure
179
+ │ ├── WebexRequest.ts # HTTP client singleton — request(), uploadLogs()
180
+ │ ├── aqm-reqs.ts # AqmReqs — HTTP request + WebSocket notification correlation
181
+ │ ├── Utils.ts # getErrorDetails, generateTaskErrorObject, isValidDialNumber
182
+ │ ├── Err.ts # Err.Details error class with structured metadata
183
+ │ ├── GlobalTypes.ts # Msg<T>, Failure, AugmentedError, TaskError
184
+ │ ├── types.ts # Req, Conf, Res types for AqmReqs
185
+ │ ├── constants.ts # Core constants
186
+ │ ├── websocket/
187
+ │ │ ├── WebSocketManager.ts # WebSocket connection handler
188
+ │ │ ├── connection-service.ts # Connection lifecycle, reconnection, keepalive
189
+ │ │ └── types.ts # WebSocket types
190
+ │ └── ai-docs/ # Core-specific documentation
191
+ │ ├── AGENTS.md
192
+ │ └── ARCHITECTURE.md
193
+ │
194
+ ├── AddressBook.ts # Address book entries — getEntries() with pagination/cache
195
+ ├── EntryPoint.ts # Entry points — getEntryPoints() with pagination/cache
196
+ ├── Queue.ts # Queues — getQueues() with pagination/cache
197
+ └── WebCallingService.ts # WebRTC calling — register/deregister line, answer/mute/decline
198
+ ```
199
+
200
+ Note: The `src/utils/` folder (sibling to `src/services/`) contains shared utilities like [`PageCache.ts`](../../utils/PageCache.ts) which provides generic pagination caching with `BaseSearchParams`, `PaginatedResponse`, and `PaginationMeta` types used by all data services.
201
+
202
+ Use [`constants.ts`](../constants.ts) as the canonical source for service-level naming and routing constants:
203
+
204
+ - `WCC_API_GATEWAY` — service identifier used by `WebexRequest` calls
205
+
206
+ - `SUBSCRIBE_API`, `LOGIN_API`, `STATE_CHANGE_API` — common API path constants
207
+
208
+ - `WEB_RTC_PREFIX` — path prefix for WebRTC-related endpoints
209
+
210
+ - `WEBSOCKET_EVENT_TIMEOUT` — defined as `20000` ms in `src/services/constants.ts` but not used by AqmReqs; active AQM correlation defaults to Core's `TIMEOUT_REQ = 20000`
211
+
212
+ - `DEFAULT_RTMS_DOMAIN`, `WCC_CALLING_RTMS_DOMAIN` — RTMS/WebRTC domain constants
213
+
214
+ - `METHODS` — method name constants used by `WebCallingService`
215
+
216
+ ## Key Files (source of truth)
217
+ | File | Holds |
218
+ |---|---|
219
+ | `src/services/index.ts` | Authoritative Services implementation or contract source. |
220
+ | `src/services/constants.ts` | Authoritative Services implementation or contract source. |
221
+ | `src/services/AddressBook.ts` | Authoritative Services implementation or contract source. |
222
+ | `src/services/EntryPoint.ts` | Authoritative Services implementation or contract source. |
223
+ | `src/services/Queue.ts` | Authoritative Services implementation or contract source. |
224
+ | `src/services/UserPreference.ts` | Direct REST user-preference CRUD exposed through `cc.userPreference`. |
225
+ | `src/services/WebCallingService.ts` | Authoritative Services implementation or contract source. |
226
+
227
+ ## Public Surface
228
+ | Contract ID | Type | Surface | Purpose | Compatibility / deprecation | Schema / detail link | Root index |
229
+ |---|---|---|---|---|---|---|
230
+ | `services.surface` | SDK / event / internal API | Internal `Services.getInstance()` composition root plus data-service and calling collaborators consumed by `ContactCenter`. | Stable module consumption boundary. | Additive changes by default; breaking package exports require a major-version transition. | `src/services/index.ts` | `../../../ai-docs/CONTRACTS.md` |
231
+ | `services.destination-lists` | SDK data API | Existing `Queue.getQueues(ContactServiceQueueSearchParams)` and `EntryPoint.getEntryPoints(EntryPointSearchParams)` methods with full-record paginated responses. | Apply consult/transfer telephony eligibility, profile views, and backend name ordering as overridable defaults. | Behavioral default correction on existing methods; no specialized method, projected response, or replacement signature. | `src/services/Queue.ts`, `src/services/EntryPoint.ts`, `src/types.ts` | `../../../ai-docs/CONTRACTS.md` |
232
+ | `services.user-preference` | SDK data API | `UserPreference` and `cc.userPreference`. | Direct REST CRUD for user preferences; separate from PageCache-based pagination services. | Additive semver-public API; removals or signature changes are breaking. | `src/services/UserPreference.ts`, `src/services/config/types.ts` | `../../../ai-docs/CONTRACTS.md` |
233
+
234
+ Compatibility notes:
235
+ - Do not remove or reinterpret exported symbols/events without a documented consumer migration.
236
+
237
+ ## Requires (dependencies)
238
+ - Host Webex SDK READY lifecycle and authenticated request facilities.
239
+ - `WebexRequest` initialized by ContactCenter before `Services.getInstance()`.
240
+ - WCC REST endpoints plus primary Contact Center and RTD WebSocket transports.
241
+ - `ApiAIAssistant`, `WebCallingService`, `MetricsManager`, TaskManager, and PageCache-consuming data services constructed by ContactCenter.
242
+ - `@webex/calling` for browser calling.
243
+
244
+ ```text
245
+ ContactCenter READY callback
246
+ ├── WebexRequest.getInstance(webex)
247
+ ├── Services.getInstance(webex, connectionConfig)
248
+ │ ├── webSocketManager + rtdWebSocketManager
249
+ │ ├── AqmReqs(primary WebSocket)
250
+ │ ├── config + agent + contact + dialer
251
+ │ └── ConnectionService(primary WebSocket)
252
+ ├── WebCallingService + ApiAIAssistant + MetricsManager
253
+ ├── TaskManager(ApiAIAssistant, contact, calling, primary WS, RTD WS)
254
+ └── AddressBook + EntryPoint + Queue + UserPreference
255
+ ```
256
+
257
+ ## Requirements
258
+ | ID | WHAT | WHY | Source Evidence | Test / Example Evidence | Assumptions / Gaps | Confidence |
259
+ |---|---|---|---|---|---|---|
260
+ | SERVICES-R-001 | Build the Services singleton with agent/config/contact/dialer, two WebSocket managers, AqmReqs, and ConnectionService after WebexRequest is initialized. | Every AQM and transport collaborator depends on one shared authenticated host and primary message stream. | `src/services/index.ts` | `test/unit/spec/cc.ts` | None; source and test evidence rechecked during the 2026-07-09 remediation; independent document revalidation pending. | PRESENT |
261
+ | SERVICES-R-002 | Keep direct REST services, including UserPreference, separate from AQM request factories. | Direct data/config/user-preference calls complete from HTTP while AQM operations require correlated WebSocket completion. | `src/services/index.ts`, `src/services/UserPreference.ts` | `test/unit/spec/services/AddressBook.ts`, `test/unit/spec/services/UserPreference.ts` | None; UserPreference's direct-REST/no-PageCache behavior was independently validated by claude-code on 2026-07-15. | PRESENT |
262
+ | SERVICES-R-003 | Construct TaskManager, UserPreference, and other non-Services collaborators in ContactCenter's READY callback, not in `register()`. | Registration is a connection boundary; changing construction timing can duplicate listeners or access uninitialized host services. | `src/cc.ts` | `test/unit/spec/cc.ts`, `test/unit/spec/services/UserPreference.ts` | None; READY-time UserPreference ownership was independently validated by claude-code on 2026-07-15. | PRESENT |
263
+ | SERVICES-R-004 | Pass ApiAIAssistant, contact routing, WebCallingService, primary WebSocket, and RTD WebSocket into TaskManager. | Voice, task, transcript, and suggestion behavior depend on the complete collaborator set. | `src/cc.ts` | `test/unit/spec/services/task/TaskManager.ts` | None; source and test evidence rechecked during the 2026-07-09 remediation; independent document revalidation pending. | PRESENT |
264
+ | SERVICES-R-005 | Inherit authenticated request identity from the host Webex SDK through Core/WebexRequest; Services must not store, parse, or refresh credentials. | One host-owned authentication boundary avoids duplicate token handling and credential leakage across composed services. | `src/services/index.ts`, `src/services/core/WebexRequest.ts` | `test/unit/spec/services/core/WebexRequest.ts` | None; authentication ownership is explicit. | PRESENT |
265
+ | SERVICES-R-006 | Treat Services composition as unconditionally created by the ContactCenter READY callback; Services owns no rollout or feature-flag decision. | Capability flags belong to the consuming config/task/calling collaborators, so the composition root must not silently gate construction. | `src/services/index.ts`, `src/cc.ts` | `test/unit/spec/cc.ts` | None; rollout applicability is explicitly N/A for Services. | PRESENT |
266
+ | SERVICES-R-007 | Existing Queue and EntryPoint list methods must apply inbound, active, telephony, profile/agent-view, and `name,ASC` defaults while retaining their established parameter and full-record response types. Caller-supplied existing filter, sort, or profile inputs override defaults. Queue must also treat `sortOrder` without `sortBy` as a name sort and bypass the simple-page cache. | Defaults on the established methods let thin consumers request lists without a parallel API, while existing parameters preserve specialized behavior for other consumers and full-record types remain truthful because no field projection is requested. | `src/services/Queue.ts`, `src/services/EntryPoint.ts`, `src/types.ts` | `test/unit/spec/services/Queue.ts`, `test/unit/spec/services/EntryPoint.ts`, `test/unit/spec/cc.ts` | The backend honors the view flags and combined CMS sort value. | PRESENT |
267
+
268
+ ## Design Overview
269
+ `Services` is a singleton composition root for transport-facing capabilities only. It constructs two `WebSocketManager` instances (primary Contact Center and RTD), creates `AqmReqs` on the primary manager, then creates config, agent, contact, dialer, and ConnectionService collaborators.
270
+
271
+ ContactCenter owns the broader READY-time graph: WebCallingService, ApiAIAssistant, MetricsManager, TaskManager, EntryPoint, AddressBook, Queue, and UserPreference. TaskManager receives ApiAIAssistant, contact routing, calling, and both WebSocket managers. None of these collaborators is created by `register()`; registration attaches runtime listeners and connects the primary socket after READY initialization.
272
+
273
+ AQM factories return functions whose HTTP request is initiation and whose promise settles on correlated primary-WebSocket notifications. Direct config/data services return authenticated REST responses.
274
+
275
+ ## Data Flow
276
+ ```mermaid
277
+ flowchart TD
278
+ Ready[Host READY] --> WR[WebexRequest singleton]
279
+ WR --> S[Services singleton]
280
+ S --> PWS[Primary WebSocketManager]
281
+ S --> RTD[RTD WebSocketManager]
282
+ PWS --> AQM[AqmReqs]
283
+ AQM --> Agent[routingAgent]
284
+ AQM --> Contact[routingContact]
285
+ AQM --> Dialer[aqmDialer]
286
+ S --> Config[AgentConfigService]
287
+ PWS --> CS[ConnectionService]
288
+ Ready --> AI[ApiAIAssistant]
289
+ Ready --> Calling[WebCallingService]
290
+ Ready --> TM[TaskManager]
291
+ Ready --> UP[UserPreference]
292
+ AI --> TM
293
+ Contact --> TM
294
+ Calling --> TM
295
+ PWS --> TM
296
+ RTD --> TM
297
+ ```
298
+
299
+ Direct REST: caller → AgentConfigService/AddressBook/EntryPoint/Queue/UserPreference → WebexRequest → response.
300
+
301
+ AQM: caller → routing factory → AqmReqs → WebexRequest HTTP acknowledgement → matching primary-WebSocket success/failure → promise settlement.
302
+
303
+ Realtime task/AI: primary or RTD WebSocket → TaskManager → Task/state machine → typed application event.
304
+
305
+ ## Sequence Diagram(s)
306
+ Sequence coverage:
307
+
308
+ | Operation group | Diagram | Failure / recovery coverage |
309
+ |---|---|---|
310
+ | READY-time composition | READY composition | Invalid initialization prevents use of the incomplete graph. |
311
+ | Direct REST | Direct REST request | HTTP/service rejection is returned directly to the caller. |
312
+ | AQM | Correlated AQM operation | HTTP rejection, matching failure notification, and timeout reject the operation. |
313
+
314
+ ### READY composition
315
+
316
+ ```mermaid
317
+ sequenceDiagram
318
+ participant Host
319
+ participant CC as ContactCenter
320
+ participant S as Services
321
+ participant TM as TaskManager
322
+ Host-->>CC: READY
323
+ CC->>CC: initialize WebexRequest
324
+ CC->>S: getInstance(webex, connectionConfig)
325
+ S->>S: primary WS + RTD WS + AqmReqs + config/agent/contact/dialer + ConnectionService
326
+ CC->>CC: create calling + AI assistant + metrics + data services + UserPreference
327
+ CC->>TM: getTaskManager(AI, contact, calling, primary WS, RTD WS)
328
+ ```
329
+
330
+ ### Direct REST request
331
+
332
+ ```mermaid
333
+ sequenceDiagram
334
+ participant Caller
335
+ participant Service as Config/data service
336
+ participant WR as WebexRequest
337
+ participant Host as Authenticated Webex request
338
+ Caller->>Service: typed REST operation
339
+ Service->>WR: request(service + resource + method)
340
+ WR->>Host: resolve service and send request
341
+ alt HTTP success
342
+ Host-->>WR: response
343
+ WR-->>Service: typed response
344
+ Service-->>Caller: result
345
+ else service/HTTP rejection
346
+ Host-->>WR: error
347
+ WR-->>Service: same rejection
348
+ Service-->>Caller: reject
349
+ end
350
+ ```
351
+
352
+ ### Correlated AQM operation
353
+
354
+ ```mermaid
355
+ sequenceDiagram
356
+ participant Caller
357
+ participant Factory as agent/contact/dialer
358
+ participant AQM as AqmReqs
359
+ participant HTTP as WebexRequest
360
+ participant WS as Primary WebSocket
361
+ Caller->>Factory: typed operation
362
+ Factory->>AQM: generated request function(payload)
363
+ AQM->>HTTP: authenticated request(config)
364
+ HTTP-->>AQM: acknowledgement
365
+ alt matching success notification
366
+ WS-->>AQM: notifSuccess.bind match
367
+ AQM-->>Caller: typed response
368
+ else matching failure or timeout
369
+ WS-->>AQM: notifFail.bind match
370
+ AQM-->>Caller: structured rejection
371
+ end
372
+ ```
373
+
374
+ ## Class / Component Relationships
375
+ ```mermaid
376
+ classDiagram
377
+ class ContactCenter
378
+ class Services
379
+ class WebSocketManager
380
+ class AqmReqs
381
+ class ConnectionService
382
+ class AgentConfigService
383
+ class TaskManager
384
+ class ApiAIAssistant
385
+ ContactCenter --> Services
386
+ Services --> WebSocketManager : primary + RTD
387
+ Services --> AqmReqs : primary WS correlation
388
+ Services --> ConnectionService
389
+ Services --> AgentConfigService
390
+ ContactCenter --> ApiAIAssistant
391
+ ContactCenter --> TaskManager
392
+ ContactCenter --> UserPreference
393
+ TaskManager --> ApiAIAssistant
394
+ TaskManager --> WebSocketManager : primary + RTD
395
+ ```
396
+
397
+ ## Use Cases
398
+ - **UC-1 Compose services:** create the transport/factory singleton once per SDK host. Evidence: `src/services/index.ts`, `test/unit/spec/cc.ts`.
399
+ - **UC-2 Direct REST:** configuration, data, and user-preference services return authenticated HTTP results directly. Evidence: `src/services/config/index.ts`, `src/services/UserPreference.ts`, `test/unit/spec/services/config/index.ts`, `test/unit/spec/services/UserPreference.ts`.
400
+ - **UC-3 AQM operation:** initiate HTTP and settle only on matching WebSocket notification or timeout. Evidence: `src/services/core/aqm-reqs.ts`, `test/unit/spec/services/core/aqm-reqs.ts`.
401
+ - **UC-4 Task/AI realtime:** TaskManager consumes primary and RTD streams with ApiAIAssistant/calling collaborators. Evidence: `src/services/task/TaskManager.ts`, `test/unit/spec/services/task/TaskManager.ts`.
402
+
403
+ ## State Model
404
+ `Services` is a process-local singleton. Its first `getInstance({webex, connectionConfig})` call synchronously constructs the two WebSocket managers, AqmReqs-backed factories, config service, and ConnectionService; later calls return that same composed graph. Socket lifecycle and domain records are owned by the corresponding collaborators, not by a Services state machine.
405
+
406
+ ## Business Rules & Invariants
407
+ - The first singleton construction fixes the host SDK and connection configuration for that Services instance.
408
+ - The primary WebSocket manager is used for AQM correlation and Contact Center events; the RTD manager remains a distinct TaskManager dependency.
409
+ - ApiAIAssistant, TaskManager, and UserPreference are READY-time ContactCenter collaborators, not fields constructed by Services.
410
+ - Authentication is inherited from the host SDK through Core/WebexRequest; Services owns no credential lifecycle.
411
+ - Rollout applicability is N/A for the Services composition root: it is created at READY and does not evaluate a feature flag.
412
+
413
+ ## Concurrency & Reactive Flow
414
+ - `getInstance` composition is synchronous in the JavaScript execution turn. Direct REST promises can proceed independently, while each AQM promise remains pending until its matching primary-WebSocket notification, HTTP failure, or timeout.
415
+
416
+ These three services share an identical pattern. Use any one as a reference when creating similar services:
417
+
418
+ | Aspect | Pattern |
419
+ |---|---|
420
+ | **Class structure** | Standalone class with `WebexRequest`, `WebexSDK`, `MetricsManager`, `PageCache` |
421
+ | **Constructor** | `constructor(webex: WebexSDK)` — gets singletons via `.getInstance()` |
422
+ | **HTTP calls** | `this.webexRequest.request({service: WCC_API_GATEWAY, resource, method: HTTP_METHODS.GET})` |
423
+ | **Endpoints** | Uses `endPointMap` functions from `config/constants.ts` to build URL paths |
424
+ | **Pagination** | Query params with `page`, `pageSize`; uses `PageCache` for caching |
425
+ | **Caching** | `PageCache<T>` — caches pages for simple pagination and bypasses cache for result/shape variants, including an effective Queue sort |
426
+ | **Consult/transfer policy** | Existing Queue and EntryPoint methods apply telephony eligibility, profile views, and backend name ordering by default, accept overrides through their existing query parameters, and return full-record responses unchanged |
427
+ | **Metrics** | `timeEvent` on API call start, `trackEvent` on success/failure |
428
+ | **Logging** | `LoggerProxy` with `{module: 'ClassName', method: 'methodName'}` context |
429
+ | **Error handling** | try/catch with `LoggerProxy.error` + `metricsManager.trackEvent` for failures, then re-throw so callers receive the error |
430
+
431
+ Reference files:
432
+
433
+ - [`AddressBook.ts`](../AddressBook.ts) — includes `addressBookId` parameter
434
+
435
+ - [`Queue.ts`](../Queue.ts) — includes additional query params (sortBy, sortOrder, etc.)
436
+
437
+ - [`EntryPoint.ts`](../EntryPoint.ts) — simplest example
438
+
439
+ `UserPreference.ts` is a separate direct REST CRUD pattern. It resolves a default user id from `agentConfig`, supports explicit user ids where applicable, and intentionally does not share PageCache behavior with the three paginated services.
440
+
441
+ ## State Machine
442
+ ```mermaid
443
+ stateDiagram-v2
444
+ [*] --> NotCreated
445
+ NotCreated --> Composed: first getInstance(options)
446
+ Composed --> Composed: later getInstance returns singleton
447
+ ```
448
+
449
+ ## Protocol / Wire Format
450
+ - Request, response, and event payload ownership is anchored in `src/services/index.ts`. HTTP initiates backend work where applicable; WebSocket messages provide realtime events and, for AQM flows, correlated completion.
451
+
452
+ ## Error Handling & Failure Modes
453
+ | Condition | Signal (error/code/result) | Caller recovery |
454
+ |---|---|---|
455
+ | Dependency rejection | Typed/rethrown error or failure event | Inspect structured details, preserve tracking id, and retry only when the operation is safe. |
456
+ | Timeout or missing async completion | Timeout/recovery state | Follow the module-specific recovery path; never synthesize success. |
457
+
458
+ ## Pitfalls
459
+ - Direct REST services complete from HTTP, while agent/contact/dialer AQM factories complete from correlated WebSocket notifications; treating them as the same transport model returns too early.
460
+ - The singleton must share one primary WebSocket with AqmReqs and a distinct RTD WebSocket with TaskManager; swapping or omitting either stream loses task or AI events.
461
+ - TaskManager and calling/AI/data/UserPreference collaborators are created by ContactCenter after READY, not by the Services constructor or `register()`.
462
+
463
+ ## Module Do's / Don'ts
464
+ - DO initialize `WebexRequest` before obtaining the Services singleton.
465
+ - DO preserve separate primary and RTD WebSocket ownership when changing composition.
466
+ - DON'T wrap direct REST services in AqmReqs or treat HTTP acknowledgement as AQM completion.
467
+ - DON'T add feature-flag decisions to the Services composition root.
468
+
469
+ ## Key Design Trade-off
470
+ - Two backend interaction patterns coexist: direct REST for immediate responses and AQM HTTP-plus-WebSocket correlation for asynchronous completion.
471
+
472
+ ## Test-Case Strategy (module)
473
+ Unit tests mirror module paths under `test/unit/spec/services`. Preserve positive and negative paths, event ordering, timeout/recovery behavior, and the package's 85% global branch/function/line/statement threshold.
474
+
475
+ | Behavior / Requirement | Existing test evidence | Gap |
476
+ |---|---|---|
477
+ | `SERVICES-R-001` | `test/unit/spec/cc.ts` | Add a focused Services singleton composition test if constructor wiring changes. |
478
+ | `SERVICES-R-002` | `test/unit/spec/services/config/index.ts`, `test/unit/spec/services/UserPreference.ts`, `test/unit/spec/services/core/aqm-reqs.ts` | Coverage is split across direct and AQM owners. |
479
+ | `SERVICES-R-003` | `test/unit/spec/cc.ts`, `test/unit/spec/services/UserPreference.ts` | None. |
480
+ | `SERVICES-R-004` | `test/unit/spec/services/task/TaskManager.ts`, `test/unit/spec/cc.ts` | None. |
481
+ | `SERVICES-R-005` | `test/unit/spec/services/core/WebexRequest.ts` | None. |
482
+ | `SERVICES-R-006` | `test/unit/spec/cc.ts` | None. |
483
+ | `SERVICES-R-007` | `test/unit/spec/services/Queue.ts`, `test/unit/spec/services/EntryPoint.ts`, `test/unit/spec/cc.ts` | None. |
484
+
485
+ ## Traceability
486
+ - Repo architecture: `../../../ai-docs/ARCHITECTURE.md` · Registry: `../../../ai-docs/SPEC_INDEX.md`
487
+ - Coverage state and contracts baseline: `../../../.sdd/manifest.json`
488
+
489
+ - [Root orchestrator AGENTS.md](../../../AGENTS.md) — repository rules; use [`SPEC_INDEX.md`](../../../ai-docs/SPEC_INDEX.md) for canonical module routing
490
+
491
+ - [ai-docs/RULES.md](../../../ai-docs/RULES.md) — coding standards
492
+
493
+ - [ai-docs/patterns/](../../../ai-docs/patterns/) — TypeScript, testing, and event patterns
494
+
495
+ - [types.ts](../../types.ts) — public type definitions
496
+
497
+ - [cc.ts](../../cc.ts) — main plugin class (public API surface)
@@ -14,6 +14,8 @@ import {
14
14
  TenantData,
15
15
  URLMapping,
16
16
  WRAP_UP_CODE,
17
+ AIFeatureFlagsResponse,
18
+ AIFeatureFlags,
17
19
  } from './types';
18
20
 
19
21
  /**
@@ -140,6 +142,7 @@ function parseAgentConfigs(profileData: {
140
142
  dialPlanData: DialPlanEntity[];
141
143
  urlMapping: URLMapping[];
142
144
  multimediaProfileId: string;
145
+ aiFeatureFlags: AIFeatureFlagsResponse;
143
146
  }): Profile {
144
147
  const {
145
148
  userData,
@@ -151,6 +154,7 @@ function parseAgentConfigs(profileData: {
151
154
  agentProfileData,
152
155
  dialPlanData,
153
156
  urlMapping,
157
+ aiFeatureFlags,
154
158
  } = profileData;
155
159
 
156
160
  const tenantDataTimeout = tenantData.timeoutDesktopInactivityEnabled
@@ -180,10 +184,12 @@ function parseAgentConfigs(profileData: {
180
184
  }); // pushing available state to idle codes
181
185
 
182
186
  const defaultWrapUpData = getDefaultWrapUpCode(wrapupCodes);
187
+ const aiFeature: AIFeatureFlags | undefined =
188
+ aiFeatureFlags?.data?.length > 0 ? aiFeatureFlags.data[0] : undefined;
183
189
 
184
190
  const finalData = {
185
191
  teams: teamData,
186
- defaultDn: userData.defaultDialledNumber,
192
+ defaultDn: userData.deafultDialledNumber,
187
193
  forceDefaultDn: tenantData.forceDefaultDn,
188
194
  forceDefaultDnForAgent: getDefaultAgentDN(agentProfileData.agentDNValidation),
189
195
  regexUS: tenantData.dnDefaultRegex,
@@ -204,6 +210,7 @@ function parseAgentConfigs(profileData: {
204
210
  siteId: userData.siteId,
205
211
  enterpriseId: orgInfoData.tenantId,
206
212
  tenantTimezone: orgInfoData.timezone,
213
+ environment: orgInfoData.environment,
207
214
  privacyShieldVisible: tenantData.privacyShieldVisible,
208
215
  organizationIdleCodes: [], // TODO: for supervisor, getOrgFilteredIdleCodes(auxCodes, false),
209
216
  idleCodesAccess: agentProfileData.accessIdleCode as 'ALL' | 'SPECIFIC',
@@ -226,11 +233,14 @@ function parseAgentConfigs(profileData: {
226
233
  isAgentAvailableAfterOutdial: agentProfileData.agentAvailableAfterOutdial,
227
234
  outDialEp: agentProfileData.outdialEntryPointId,
228
235
  isCampaignManagementEnabled: orgSettingsData.campaignManagerEnabled,
229
- isEndCallEnabled: tenantData.endCallEnabled,
236
+ isEndTaskEnabled: tenantData.endCallEnabled,
230
237
  isEndConsultEnabled: tenantData.endConsultEnabled,
231
238
  callVariablesSuppressed: tenantData.callVariablesSuppressed,
232
239
  agentDbId: userData.dbId,
233
240
  allowConsultToQueue: agentProfileData.consultToQueue,
241
+ accessQueue: agentProfileData.accessQueue,
242
+ accessEntryPoint: agentProfileData.accessEntryPoint,
243
+ accessBuddyTeam: agentProfileData.accessBuddyTeam,
234
244
  agentPersonalStatsEnabled: agentProfileData.viewableStatistics
235
245
  ? agentProfileData.viewableStatistics.agentStats
236
246
  : false,
@@ -253,6 +263,7 @@ function parseAgentConfigs(profileData: {
253
263
  webexConfig: getWebexConfig(agentProfileData),
254
264
  lostConnectionRecoveryTimeout:
255
265
  tenantData.lostConnectionRecoveryTimeout || LOST_CONNECTION_RECOVERY_TIMEOUT,
266
+ aiFeature,
256
267
  };
257
268
 
258
269
  return finalData;