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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/.sdd/manifest.json +882 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +46 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +341 -0
  17. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  18. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  19. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  20. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  21. package/ai-docs/patterns/testing-patterns.md +480 -0
  22. package/ai-docs/patterns/typescript-patterns.md +365 -0
  23. package/ai-docs/templates/README.md +102 -0
  24. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  25. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  26. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  27. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  28. package/ai-docs/templates/new-method/00-master.md +80 -0
  29. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  30. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  31. package/ai-docs/templates/new-method/03-tests.md +201 -0
  32. package/ai-docs/templates/new-method/04-validation.md +141 -0
  33. package/ai-docs/templates/new-service/00-master.md +109 -0
  34. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  35. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  36. package/ai-docs/templates/new-service/03-integration.md +178 -0
  37. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  38. package/ai-docs/templates/new-service/05-validation.md +145 -0
  39. package/dist/cc.js +379 -50
  40. package/dist/cc.js.map +1 -1
  41. package/dist/config.js +6 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.js +22 -2
  44. package/dist/constants.js.map +1 -1
  45. package/dist/index.js +27 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/metrics/behavioral-events.js +114 -0
  48. package/dist/metrics/behavioral-events.js.map +1 -1
  49. package/dist/metrics/constants.js +32 -3
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/services/ApiAiAssistant.js +318 -0
  52. package/dist/services/ApiAiAssistant.js.map +1 -0
  53. package/dist/services/UserPreference.js +427 -0
  54. package/dist/services/UserPreference.js.map +1 -0
  55. package/dist/services/agent/types.js.map +1 -1
  56. package/dist/services/config/Util.js +8 -4
  57. package/dist/services/config/Util.js.map +1 -1
  58. package/dist/services/config/constants.js +35 -2
  59. package/dist/services/config/constants.js.map +1 -1
  60. package/dist/services/config/index.js +41 -2
  61. package/dist/services/config/index.js.map +1 -1
  62. package/dist/services/config/types.js +66 -8
  63. package/dist/services/config/types.js.map +1 -1
  64. package/dist/services/constants.js +27 -1
  65. package/dist/services/constants.js.map +1 -1
  66. package/dist/services/core/Err.js.map +1 -1
  67. package/dist/services/core/Utils.js +122 -25
  68. package/dist/services/core/Utils.js.map +1 -1
  69. package/dist/services/core/aqm-reqs.js +92 -17
  70. package/dist/services/core/aqm-reqs.js.map +1 -1
  71. package/dist/services/core/websocket/WebSocketManager.js +22 -6
  72. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  73. package/dist/services/core/websocket/connection-service.js +3 -1
  74. package/dist/services/core/websocket/connection-service.js.map +1 -1
  75. package/dist/services/core/websocket/types.js.map +1 -1
  76. package/dist/services/index.js +6 -0
  77. package/dist/services/index.js.map +1 -1
  78. package/dist/services/task/Task.js +688 -0
  79. package/dist/services/task/Task.js.map +1 -0
  80. package/dist/services/task/TaskFactory.js +45 -0
  81. package/dist/services/task/TaskFactory.js.map +1 -0
  82. package/dist/services/task/TaskManager.js +751 -457
  83. package/dist/services/task/TaskManager.js.map +1 -1
  84. package/dist/services/task/TaskUtils.js +220 -23
  85. package/dist/services/task/TaskUtils.js.map +1 -1
  86. package/dist/services/task/constants.js +23 -2
  87. package/dist/services/task/constants.js.map +1 -1
  88. package/dist/services/task/dialer.js +129 -0
  89. package/dist/services/task/dialer.js.map +1 -1
  90. package/dist/services/task/digital/Digital.js +77 -0
  91. package/dist/services/task/digital/Digital.js.map +1 -0
  92. package/dist/services/task/state-machine/TaskStateMachine.js +873 -0
  93. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  94. package/dist/services/task/state-machine/actions.js +567 -0
  95. package/dist/services/task/state-machine/actions.js.map +1 -0
  96. package/dist/services/task/state-machine/constants.js +161 -0
  97. package/dist/services/task/state-machine/constants.js.map +1 -0
  98. package/dist/services/task/state-machine/guards.js +382 -0
  99. package/dist/services/task/state-machine/guards.js.map +1 -0
  100. package/dist/services/task/state-machine/index.js +53 -0
  101. package/dist/services/task/state-machine/index.js.map +1 -0
  102. package/dist/services/task/state-machine/types.js +54 -0
  103. package/dist/services/task/state-machine/types.js.map +1 -0
  104. package/dist/services/task/state-machine/uiControlsComputer.js +603 -0
  105. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  106. package/dist/services/task/taskDataNormalizer.js +99 -0
  107. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  108. package/dist/services/task/types.js +227 -4
  109. package/dist/services/task/types.js.map +1 -1
  110. package/dist/services/task/voice/Voice.js +1044 -0
  111. package/dist/services/task/voice/Voice.js.map +1 -0
  112. package/dist/services/task/voice/WebRTC.js +149 -0
  113. package/dist/services/task/voice/WebRTC.js.map +1 -0
  114. package/dist/types/cc.d.ts +894 -0
  115. package/dist/types/config.d.ts +72 -0
  116. package/dist/types/constants.d.ts +66 -0
  117. package/dist/types/index.d.ts +199 -0
  118. package/dist/types/logger-proxy.d.ts +71 -0
  119. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  120. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  121. package/dist/types/metrics/constants.d.ts +181 -0
  122. package/dist/types/services/AddressBook.d.ts +74 -0
  123. package/dist/types/services/ApiAiAssistant.d.ts +49 -0
  124. package/dist/types/services/EntryPoint.d.ts +67 -0
  125. package/dist/types/services/Queue.d.ts +76 -0
  126. package/dist/types/services/UserPreference.d.ts +118 -0
  127. package/dist/types/services/WebCallingService.d.ts +1 -0
  128. package/dist/types/services/agent/index.d.ts +46 -0
  129. package/dist/types/services/agent/types.d.ts +413 -0
  130. package/dist/types/services/config/Util.d.ts +20 -0
  131. package/dist/types/services/config/constants.d.ts +270 -0
  132. package/dist/types/services/config/index.d.ts +177 -0
  133. package/dist/types/services/config/types.d.ts +1368 -0
  134. package/dist/types/services/constants.d.ts +110 -0
  135. package/dist/types/services/core/Err.d.ts +125 -0
  136. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  137. package/dist/types/services/core/Utils.d.ts +121 -0
  138. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  139. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  140. package/dist/types/services/core/constants.d.ts +99 -0
  141. package/dist/types/services/core/types.d.ts +47 -0
  142. package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
  143. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  144. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  145. package/dist/types/services/core/websocket/types.d.ts +37 -0
  146. package/dist/types/services/index.d.ts +54 -0
  147. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  148. package/dist/types/services/task/Task.d.ts +157 -0
  149. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  150. package/dist/types/services/task/TaskManager.d.ts +1 -0
  151. package/dist/types/services/task/TaskUtils.d.ts +138 -0
  152. package/dist/types/services/task/constants.d.ts +91 -0
  153. package/dist/types/services/task/contact.d.ts +69 -0
  154. package/dist/types/services/task/dialer.d.ts +73 -0
  155. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  156. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1194 -0
  157. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  158. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  159. package/dist/types/services/task/state-machine/guards.d.ts +102 -0
  160. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  161. package/dist/types/services/task/state-machine/types.d.ts +269 -0
  162. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  163. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  164. package/dist/types/services/task/types.d.ts +1856 -0
  165. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  166. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  167. package/dist/types/types.d.ts +778 -0
  168. package/dist/types/utils/PageCache.d.ts +173 -0
  169. package/dist/types/webex-config.d.ts +53 -0
  170. package/dist/types/webex.d.ts +8 -0
  171. package/dist/types.js +130 -1
  172. package/dist/types.js.map +1 -1
  173. package/dist/webex.js +14 -2
  174. package/dist/webex.js.map +1 -1
  175. package/package.json +16 -12
  176. package/src/cc.ts +477 -51
  177. package/src/config.ts +6 -0
  178. package/src/constants.ts +21 -1
  179. package/src/index.ts +24 -5
  180. package/src/metrics/ai-docs/AGENTS.md +350 -0
  181. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  182. package/src/metrics/ai-docs/metrics-spec.md +854 -0
  183. package/src/metrics/behavioral-events.ts +120 -0
  184. package/src/metrics/constants.ts +37 -3
  185. package/src/services/ApiAiAssistant.ts +412 -0
  186. package/src/services/UserPreference.ts +509 -0
  187. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  188. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  189. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  190. package/src/services/agent/types.ts +1 -1
  191. package/src/services/ai-docs/AGENTS.md +386 -0
  192. package/src/services/ai-docs/services-spec.md +492 -0
  193. package/src/services/config/Util.ts +10 -2
  194. package/src/services/config/ai-docs/AGENTS.md +255 -0
  195. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  196. package/src/services/config/ai-docs/config-spec.md +669 -0
  197. package/src/services/config/constants.ts +37 -1
  198. package/src/services/config/index.ts +45 -1
  199. package/src/services/config/types.ts +241 -11
  200. package/src/services/constants.ts +29 -0
  201. package/src/services/core/Err.ts +3 -0
  202. package/src/services/core/Utils.ts +143 -30
  203. package/src/services/core/ai-docs/AGENTS.md +381 -0
  204. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  205. package/src/services/core/ai-docs/core-spec.md +783 -0
  206. package/src/services/core/aqm-reqs.ts +100 -22
  207. package/src/services/core/websocket/WebSocketManager.ts +23 -6
  208. package/src/services/core/websocket/connection-service.ts +5 -1
  209. package/src/services/core/websocket/types.ts +1 -1
  210. package/src/services/index.ts +4 -0
  211. package/src/services/task/Task.ts +837 -0
  212. package/src/services/task/TaskFactory.ts +55 -0
  213. package/src/services/task/TaskManager.ts +793 -521
  214. package/src/services/task/TaskUtils.ts +314 -24
  215. package/src/services/task/ai-docs/AGENTS.md +457 -0
  216. package/src/services/task/ai-docs/ARCHITECTURE.md +594 -0
  217. package/src/services/task/ai-docs/task-spec.md +1319 -0
  218. package/src/services/task/constants.ts +23 -0
  219. package/src/services/task/dialer.ts +136 -1
  220. package/src/services/task/digital/Digital.ts +95 -0
  221. package/src/services/task/state-machine/TaskStateMachine.ts +1166 -0
  222. package/src/services/task/state-machine/actions.ts +738 -0
  223. package/src/services/task/state-machine/ai-docs/AGENTS.md +458 -0
  224. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1137 -0
  225. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2177 -0
  226. package/src/services/task/state-machine/constants.ts +172 -0
  227. package/src/services/task/state-machine/guards.ts +445 -0
  228. package/src/services/task/state-machine/index.ts +28 -0
  229. package/src/services/task/state-machine/types.ts +243 -0
  230. package/src/services/task/state-machine/uiControlsComputer.ts +961 -0
  231. package/src/services/task/taskDataNormalizer.ts +137 -0
  232. package/src/services/task/types.ts +734 -71
  233. package/src/services/task/voice/Voice.ts +1270 -0
  234. package/src/services/task/voice/WebRTC.ts +187 -0
  235. package/src/types.ts +205 -2
  236. package/src/utils/AGENTS.md +278 -0
  237. package/src/utils/ai-docs/utils-spec.md +381 -0
  238. package/src/webex.js +2 -0
  239. package/test/unit/spec/cc.ts +503 -43
  240. package/test/unit/spec/logger-proxy.ts +70 -0
  241. package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
  242. package/test/unit/spec/services/UserPreference.ts +401 -0
  243. package/test/unit/spec/services/WebCallingService.ts +7 -1
  244. package/test/unit/spec/services/config/index.ts +85 -29
  245. package/test/unit/spec/services/core/Utils.ts +481 -2
  246. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
  247. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  248. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  249. package/test/unit/spec/services/task/Task.ts +477 -0
  250. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  251. package/test/unit/spec/services/task/TaskManager.ts +1001 -1003
  252. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  253. package/test/unit/spec/services/task/dialer.ts +372 -96
  254. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  255. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +2651 -0
  256. package/test/unit/spec/services/task/state-machine/guards.ts +637 -0
  257. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  258. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2663 -0
  259. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  260. package/test/unit/spec/services/task/voice/Voice.ts +649 -0
  261. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  262. package/umd/contact-center.min.js +2 -2
  263. package/umd/contact-center.min.js.map +1 -1
  264. package/dist/services/task/index.js +0 -1525
  265. package/dist/services/task/index.js.map +0 -1
  266. package/src/services/task/index.ts +0 -1801
  267. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,386 @@
1
+ # Services Layer - AI Agent Guide
2
+
3
+ > **Legacy/reference-only.** Canonical SDD: [`services-spec.md`](services-spec.md). Use the package [manifest](../../../.sdd/manifest.json) and [`SPEC_INDEX.md`](../../../ai-docs/SPEC_INDEX.md) for routing; code and tests remain the behavioral referee.
4
+ >
5
+ > **Legacy scope:** This guide describes how service modules were documented before canonical SDD routing. For repository rules, see the [root orchestrator AGENTS.md](../../../AGENTS.md).
6
+
7
+ ---
8
+
9
+ ## Purpose
10
+
11
+ 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.
12
+
13
+ ### Scenarios this document resolves
14
+
15
+ - Understanding service composition and which service owns which responsibility
16
+ - Determining the correct instantiation/bootstrap order for services
17
+ - Tracing request flow from `cc.ts` through services to the backend
18
+ - Choosing between AqmReqs and direct REST patterns for a new method
19
+ - Adding a new data service (AddressBook/Queue/EntryPoint pattern)
20
+ - Adding a new AqmReqs method to agent, task, or dialer factories
21
+ - Routing to the correct service-level docs for task/agent/config/core changes
22
+ - Clarifying what the Services singleton creates vs what `cc.ts` creates
23
+
24
+ ---
25
+
26
+ ## When to Load This Document
27
+
28
+ Load this services-layer guide when:
29
+ - Understanding **how services are composed** or **instantiation order**
30
+ - Adding a **new data service** (follow AddressBook/Queue/EntryPoint pattern)
31
+ - Adding a **new AqmReqs method** (follow agent/contact factory pattern)
32
+ - Debugging **cross-service interactions** or **bootstrap failures**
33
+ - Understanding the **request/response flow** (AqmReqs vs direct REST)
34
+
35
+ For implementation details within a specific service, follow the links in the [Service Routing table](#service-routing-scope-level-ai-docs).
36
+
37
+ ---
38
+
39
+ ## File Structure
40
+
41
+ ```
42
+ src/services/
43
+ ├── index.ts # Services singleton — composes all services
44
+ ├── constants.ts # Shared constants (gateway id, API paths, WebRTC domains/prefixes, timeout, method-name constants)
45
+ ├── ai-docs/
46
+ │ └── AGENTS.md # THIS FILE — services layer orchestrator
47
+
48
+ ├── agent/ # Agent operations service
49
+ │ ├── index.ts # routingAgent factory — stationLogin, stateChange, logout, buddyAgents
50
+ │ ├── types.ts # Agent types: StateChange, Logout, AGENT_EVENTS, LoginOption
51
+ │ └── ai-docs/ # Agent-specific documentation
52
+ │ ├── AGENTS.md
53
+ │ └── ARCHITECTURE.md
54
+
55
+ ├── task/ # Task management service
56
+ │ ├── TaskManager.ts # Task lifecycle manager — creates/destroys Task instances
57
+ │ ├── Task.ts # Individual task — hold, transfer, conference, wrapup
58
+ │ ├── TaskFactory.ts # Creates Task with config flags
59
+ │ ├── contact.ts # routingContact factory — task operations via AqmReqs
60
+ │ ├── dialer.ts # aqmDialer factory — outbound dialing
61
+ │ ├── AutoWrapup.ts # Auto wrapup timer handler
62
+ │ ├── TaskUtils.ts # Task utility functions
63
+ │ ├── taskDataNormalizer.ts # Normalizes task data from events
64
+ │ ├── types.ts # Task types: ITask, TASK_EVENTS, TaskResponse
65
+ │ ├── constants.ts # Task constants
66
+ │ ├── voice/ # Voice-specific task handling
67
+ │ │ ├── Voice.ts # Voice task operations
68
+ │ │ └── WebRTC.ts # WebRTC-specific voice operations
69
+ │ ├── digital/ # Digital channel task handling
70
+ │ │ └── Digital.ts # Digital task operations
71
+ │ ├── state-machine/ # XState-based task state machine
72
+ │ │ ├── TaskStateMachine.ts # State machine definition
73
+ │ │ ├── index.ts # Barrel export for state machine public API
74
+ │ │ ├── constants.ts # TaskState, TaskEvent enums
75
+ │ │ ├── types.ts # TaskContext type
76
+ │ │ ├── guards.ts # State transition guards
77
+ │ │ ├── actions.ts # State transition actions
78
+ │ │ ├── uiControlsComputer.ts # Computes UI controls from state
79
+ │ │ └── ai-docs/ # State machine documentation
80
+ │ │ ├── AGENTS.md
81
+ │ │ └── ARCHITECTURE.md
82
+ │ └── ai-docs/ # Task-specific documentation
83
+ │ ├── AGENTS.md
84
+ │ └── ARCHITECTURE.md
85
+
86
+ ├── config/ # Configuration service
87
+ │ ├── index.ts # AgentConfigService — getAgentConfig(), profile aggregation
88
+ │ ├── Util.ts # parseAgentConfigs, getFilterAuxCodes, helper functions
89
+ │ ├── types.ts # CC_EVENTS, Profile, CC_AGENT_EVENTS, CC_TASK_EVENTS
90
+ │ ├── constants.ts # endPointMap (API URL builders), pagination defaults
91
+ │ └── ai-docs/ # Config-specific documentation
92
+ │ ├── AGENTS.md
93
+ │ └── ARCHITECTURE.md
94
+
95
+ ├── core/ # Core infrastructure
96
+ │ ├── WebexRequest.ts # HTTP client singleton — request(), uploadLogs()
97
+ │ ├── aqm-reqs.ts # AqmReqs — HTTP request + WebSocket notification correlation
98
+ │ ├── Utils.ts # getErrorDetails, generateTaskErrorObject, isValidDialNumber
99
+ │ ├── Err.ts # Err.Details error class with structured metadata
100
+ │ ├── GlobalTypes.ts # Msg<T>, Failure, AugmentedError, TaskError
101
+ │ ├── types.ts # Req, Conf, Res types for AqmReqs
102
+ │ ├── constants.ts # Core constants
103
+ │ ├── websocket/
104
+ │ │ ├── WebSocketManager.ts # WebSocket connection handler
105
+ │ │ ├── connection-service.ts # Connection lifecycle, reconnection, keepalive
106
+ │ │ └── types.ts # WebSocket types
107
+ │ └── ai-docs/ # Core-specific documentation
108
+ │ ├── AGENTS.md
109
+ │ └── ARCHITECTURE.md
110
+
111
+ ├── AddressBook.ts # Address book entries — getEntries() with pagination/cache
112
+ ├── EntryPoint.ts # Entry points — getEntryPoints() with pagination/cache
113
+ ├── Queue.ts # Queues — getQueues() with pagination/cache
114
+ └── WebCallingService.ts # WebRTC calling — register/deregister line, answer/mute/decline
115
+ ```
116
+
117
+ 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.
118
+
119
+ ### Shared Constants (`src/services/constants.ts`)
120
+
121
+ Use [`constants.ts`](../constants.ts) as the canonical source for service-level naming and routing constants:
122
+ - `WCC_API_GATEWAY` — service identifier used by `WebexRequest` calls
123
+ - `SUBSCRIBE_API`, `LOGIN_API`, `STATE_CHANGE_API` — common API path constants
124
+ - `WEB_RTC_PREFIX` — path prefix for WebRTC-related endpoints
125
+ - `WEBSOCKET_EVENT_TIMEOUT` — default notification correlation timeout (`20000` ms)
126
+ - `DEFAULT_RTMS_DOMAIN`, `WCC_CALLING_RTMS_DOMAIN` — RTMS/WebRTC domain constants
127
+ - `METHODS` — method name constants used by `WebCallingService`
128
+
129
+ ---
130
+
131
+ ## Key Capabilities
132
+
133
+ | Capability | Owner | Description |
134
+ |---|---|---|
135
+ | **Service Singleton** | [`index.ts`](../index.ts) | Central `Services` class that instantiates and provides access to all service modules via `Services.getInstance()` |
136
+ | **Agent Operations** | [`agent/`](../agent/index.ts) | Station login/logout, state changes, buddy agents — uses AqmReqs factory pattern |
137
+ | **Task Management** | [`task/`](../task/TaskManager.ts) | Task lifecycle (accept, hold, transfer, conference, wrapup), Task state machine, contact operations, outbound dialing |
138
+ | **Configuration** | [`config/`](../config/index.ts) | Agent profile aggregation from 8+ API endpoints, org settings, teams, aux codes, dial plans |
139
+ | **Core Infrastructure** | [`core/`](../core/WebexRequest.ts) | HTTP requests (`WebexRequest`), WebSocket management (`WebSocketManager`), connection lifecycle (`ConnectionService`), AQM request/response correlation (`AqmReqs`), error handling (`Utils`, `Err`) |
140
+ | **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 |
141
+ | **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 |
142
+ | **WebRTC Calling** | [`WebCallingService.ts`](../WebCallingService.ts) | Browser-based voice calling via `@webex/calling`, line registration, call answer/mute/decline |
143
+
144
+ ---
145
+
146
+ ## Service Routing (Scope-Level ai-docs)
147
+
148
+ Each service folder contains its own `ai-docs/` with detailed documentation. **Always load the relevant service docs before making changes.**
149
+
150
+ | Service | Scope / Keywords | AGENTS.md | ARCHITECTURE.md |
151
+ |---------|-----------------|-----------|-----------------|
152
+ | **Agent** | login, logout, state change, buddy agents, station, RONA | [`agent/ai-docs/AGENTS.md`](../agent/ai-docs/AGENTS.md) | [`agent/ai-docs/ARCHITECTURE.md`](../agent/ai-docs/ARCHITECTURE.md) |
153
+ | **Task** | task, hold, transfer, conference, wrapup, outdial, consult, accept, decline, state machine, XState, task states, guards, actions | [`task/ai-docs/AGENTS.md`](../task/ai-docs/AGENTS.md) | [`task/ai-docs/ARCHITECTURE.md`](../task/ai-docs/ARCHITECTURE.md) |
154
+ | **Config** | profile, register, teams, aux codes, desktop profile, org settings, dial plan | [`config/ai-docs/AGENTS.md`](../config/ai-docs/AGENTS.md) | [`config/ai-docs/ARCHITECTURE.md`](../config/ai-docs/ARCHITECTURE.md) |
155
+ | **Core** | websocket, HTTP, connection, reconnect, aqm, utils, errors, keepalive | [`core/ai-docs/AGENTS.md`](../core/ai-docs/AGENTS.md) | [`core/ai-docs/ARCHITECTURE.md`](../core/ai-docs/ARCHITECTURE.md) |
156
+
157
+ > **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/AGENTS.md`](../task/state-machine/ai-docs/AGENTS.md) and [`ARCHITECTURE.md`](../task/state-machine/ai-docs/ARCHITECTURE.md). Load these when working on state transitions, guards, or actions.
158
+
159
+ **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).
160
+
161
+ **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.
162
+
163
+ ---
164
+
165
+ ## Architecture Overview
166
+
167
+ ### How cc.ts Uses the Services Layer
168
+
169
+ The `ContactCenter` plugin class (`cc.ts`) is the **only public entry point**. It delegates all backend work to the services layer:
170
+
171
+ ```
172
+ ContactCenter (cc.ts) — public API surface
173
+
174
+ ├── WebexRequest.getInstance({webex}) ← initialized FIRST (singleton)
175
+ ├── Services.getInstance({webex, connectionConfig}) ← initialized SECOND (singleton)
176
+ │ │
177
+ │ ├── WebSocketManager ← real-time message transport
178
+ │ ├── AqmReqs ← HTTP request + WebSocket notification correlation
179
+ │ ├── ConnectionService ← WebSocket lifecycle, reconnection, keepalive
180
+ │ ├── AgentConfigService (config) ← profile aggregation via REST APIs
181
+ │ ├── routingAgent (agent) ← agent operations via AqmReqs factory
182
+ │ ├── routingContact (contact) ← task/contact operations via AqmReqs factory
183
+ │ └── aqmDialer (dialer) ← outbound dialing via AqmReqs factory
184
+
185
+ ├── TaskManager ← task lifecycle, created during register()
186
+ ├── WebCallingService ← WebRTC calling, created during register() (line registration is conditional)
187
+ ├── AddressBook ← REST data service, created during register()
188
+ ├── EntryPoint ← REST data service, created during register()
189
+ ├── Queue ← REST data service, created during register()
190
+ └── MetricsManager.getInstance({webex}) ← telemetry singleton
191
+ ```
192
+
193
+ ### Bootstrap Order (Critical)
194
+
195
+ Understanding the instantiation order is essential — getting it wrong causes runtime errors:
196
+
197
+ 1. **`WebexRequest.getInstance({webex})`** — Must be called first. The singleton HTTP client that all services depend on.
198
+ 2. **`Services.getInstance({webex, connectionConfig})`** — Creates `WebSocketManager`, `AqmReqs`, `ConnectionService`, `AgentConfigService`, `routingAgent`, `routingContact`, `aqmDialer`.
199
+ 3. **`WebCallingService`** — Created during `register()` for calling lifecycle management. `registerWebCallingLine()` is later invoked conditionally for `loginOption === 'BROWSER'`.
200
+ 4. **`MetricsManager.getInstance({webex})`** — Telemetry singleton.
201
+ 5. **`TaskManager`** — Created during `register()` and wired to services/WebSocket.
202
+ 6. **Data services** (`AddressBook`, `EntryPoint`, `Queue`) — Created during `register()`.
203
+
204
+ ### Request/Response Flow Pattern
205
+
206
+ There are two distinct patterns used across services:
207
+
208
+ #### Pattern 1: AqmReqs (Agent + Task operations)
209
+
210
+ Used by `routingAgent`, `routingContact`, and `aqmDialer`. This pattern sends an HTTP REST request to the backend and waits for a correlated WebSocket notification:
211
+
212
+ ```
213
+ cc.ts method call
214
+ → services.agent.methodName({data}) (or services.contact / services.dialer)
215
+ → AqmReqs.req() sends HTTP request (via WebexRequest.request())
216
+ → Backend REST API processes
217
+ → Backend sends WebSocket notification (success or failure)
218
+ → AqmReqs correlates notification to pending request
219
+ → Promise resolves/rejects
220
+ ```
221
+
222
+ Key detail: **The HTTP request goes directly to the backend. The WebSocket only carries the notification back.** This is NOT request-over-WebSocket.
223
+
224
+ #### Pattern 2: Direct REST (Config + Data services)
225
+
226
+ Used by `AgentConfigService`, `AddressBook`, `Queue`, `EntryPoint`. These make direct HTTP calls and return the response:
227
+
228
+ ```
229
+ cc.ts method call
230
+ → service.method()
231
+ → WebexRequest.request({service, resource, method})
232
+ → Backend REST API
233
+ → Response returned directly
234
+ → Promise resolves/rejects
235
+ ```
236
+
237
+ ---
238
+
239
+ ## Services Singleton (index.ts)
240
+
241
+ The `Services` class is the central composition root. It uses a singleton pattern:
242
+
243
+ ```typescript
244
+ const services = Services.getInstance({
245
+ webex: this.$webex,
246
+ connectionConfig: subscribeRequest,
247
+ });
248
+ ```
249
+
250
+ ### What Services creates in its constructor
251
+
252
+ | Component | How Created | Purpose |
253
+ |---|---|---|
254
+ | `webSocketManager` | `new WebSocketManager({webex})` | WebSocket transport for real-time messages |
255
+ | `aqmReq` (internal) | `new AqmReqs(webSocketManager)` | Correlates HTTP requests with WebSocket notifications |
256
+ | `config` | `new AgentConfigService()` | REST-based profile aggregation |
257
+ | `agent` | `routingAgent(aqmReq)` | Agent operations factory |
258
+ | `contact` | `routingContact(aqmReq)` | Task/contact operations factory |
259
+ | `dialer` | `aqmDialer(aqmReq)` | Outbound dialing factory |
260
+ | `connectionService` | `new ConnectionService({webSocketManager, subscribeRequest})` | WebSocket lifecycle management |
261
+
262
+ ### What Services does NOT create
263
+
264
+ - `WebexRequest` — initialized by `cc.ts` before `Services.getInstance()`
265
+ - `TaskManager` — created by `cc.ts` during `register()`
266
+ - `WebCallingService` — created by `cc.ts` during `register()` (line registration is conditional on `loginOption === 'BROWSER'`)
267
+ - `AddressBook`, `EntryPoint`, `Queue` — created by `cc.ts` during `register()`
268
+ - `MetricsManager` — independent singleton initialized by `cc.ts`
269
+
270
+ ---
271
+
272
+ ## Data Services Pattern (AddressBook, Queue, EntryPoint)
273
+
274
+ These three services share an identical pattern. Use any one as a reference when creating similar services:
275
+
276
+ | Aspect | Pattern |
277
+ |---|---|
278
+ | **Class structure** | Standalone class with `WebexRequest`, `WebexSDK`, `MetricsManager`, `PageCache` |
279
+ | **Constructor** | `constructor(webex: WebexSDK)` — gets singletons via `.getInstance()` |
280
+ | **HTTP calls** | `this.webexRequest.request({service: WCC_API_GATEWAY, resource, method: HTTP_METHODS.GET})` |
281
+ | **Endpoints** | Uses `endPointMap` functions from `config/constants.ts` to build URL paths |
282
+ | **Pagination** | Query params with `page`, `pageSize`; uses `PageCache` for caching |
283
+ | **Caching** | `PageCache<T>` — caches pages for simple pagination, bypasses cache for search/filter |
284
+ | **Metrics** | `timeEvent` on API call start, `trackEvent` on success/failure |
285
+ | **Logging** | `LoggerProxy` with `{module: 'ClassName', method: 'methodName'}` context |
286
+ | **Error handling** | try/catch with `LoggerProxy.error` + `metricsManager.trackEvent` for failures, then re-throw so callers receive the error |
287
+
288
+ Reference files:
289
+ - [`AddressBook.ts`](../AddressBook.ts) — includes `addressBookId` parameter
290
+ - [`Queue.ts`](../Queue.ts) — includes additional query params (sortBy, sortOrder, etc.)
291
+ - [`EntryPoint.ts`](../EntryPoint.ts) — simplest example
292
+
293
+ ---
294
+
295
+ ## AqmReqs Factory Pattern (Agent + Task operations)
296
+
297
+ Agent and task operations use a factory pattern where each method is defined as a `routing.req()` call:
298
+
299
+ ```typescript
300
+ export default function routingAgent(routing: AqmReqs) {
301
+ return {
302
+ stationLogin: routing.req((p: {data: LoginPayload}) => ({
303
+ url: '/v1/agents/login',
304
+ host: WCC_API_GATEWAY,
305
+ data: p.data,
306
+ err: createErrDetailsObject,
307
+ notifSuccess: { bind: {...}, msg: {} as SuccessType },
308
+ notifFail: { bind: {...}, errId: 'Service.aqm.agent.stationLogin' },
309
+ })),
310
+ };
311
+ }
312
+ ```
313
+
314
+ Key points:
315
+ - `url` + `host` define the HTTP endpoint
316
+ - `data` is the request body (POST by default, GET if no data)
317
+ - `notifSuccess.bind` specifies which WebSocket event type indicates success
318
+ - `notifFail.bind` specifies which WebSocket event type indicates failure
319
+ - `errId` maps to an `Err.Details` error identifier
320
+ - The returned function is a `Promise` that resolves when the correlated WebSocket notification arrives
321
+
322
+ Reference files:
323
+ - [`agent/index.ts`](../agent/index.ts) — agent operations
324
+ - [`task/contact.ts`](../task/contact.ts) — task operations
325
+ - [`task/dialer.ts`](../task/dialer.ts) — outbound dialing
326
+
327
+ ---
328
+
329
+ ## Cross-Service Dependencies
330
+
331
+ ```
332
+ cc.ts
333
+ ├─ uses → Services.agent (stationLogin, stateChange, logout, buddyAgents)
334
+ ├─ uses → Services.config (getAgentConfig)
335
+ ├─ uses → Services.contact (task operations, forwarded through TaskManager/Task)
336
+ ├─ uses → Services.dialer (startOutdial)
337
+ ├─ uses → Services.webSocketManager (message listener for event routing)
338
+ ├─ uses → Services.connectionService (connection lifecycle events)
339
+ ├─ uses → WebexRequest (uploadLogs)
340
+ ├─ uses → TaskManager (task lifecycle, created during register())
341
+ ├─ uses → WebCallingService (WebRTC, created during register(); line registration is conditional on BROWSER login)
342
+ ├─ uses → AddressBook (address book queries)
343
+ ├─ uses → EntryPoint (entry point queries)
344
+ └─ uses → Queue (queue queries)
345
+
346
+ TaskManager
347
+ ├─ uses → Services.contact (task operations via AqmReqs)
348
+ ├─ uses → Services.dialer (outbound dialing)
349
+ ├─ uses → Services.config (config flags)
350
+ └─ creates → Task instances (each with its own state machine)
351
+
352
+ AgentConfigService (config)
353
+ └─ uses → WebexRequest (direct REST calls for profile data)
354
+
355
+ AqmReqs
356
+ ├─ uses → WebexRequest (sends HTTP requests)
357
+ └─ uses → WebSocketManager (listens for correlated notifications)
358
+ ```
359
+
360
+ ---
361
+
362
+ ## Event Flow Through Services
363
+
364
+ WebSocket messages are fanned out to multiple independent listeners on `WebSocketManager`:
365
+
366
+ ```
367
+ CC Backend
368
+ → WebSocket message arrives at WebSocketManager
369
+ → WebSocketManager emits 'message'
370
+ → AqmReqs listener (`aqm-reqs.ts`) — correlates pending request notifications
371
+ → cc.ts listener (`cc.ts`) — handles plugin-level events:
372
+ → Agent events use `this.emit(...)` (EventEmitter API)
373
+ → Task notifications use `this.trigger(...)` (WebexPlugin API)
374
+ → TaskManager listener (`TaskManager.ts`) — processes task events for task lifecycle/state
375
+ → ConnectionService listener (`connection-service.ts`) — processes connection/keepalive events
376
+ ```
377
+
378
+ ---
379
+
380
+ ## Related
381
+
382
+ - [Root orchestrator AGENTS.md](../../../AGENTS.md) — repository rules; use [`SPEC_INDEX.md`](../../../ai-docs/SPEC_INDEX.md) for canonical module routing
383
+ - [ai-docs/RULES.md](../../../ai-docs/RULES.md) — coding standards
384
+ - [ai-docs/patterns/](../../../ai-docs/patterns/) — TypeScript, testing, and event patterns
385
+ - [types.ts](../../types.ts) — public type definitions
386
+ - [cc.ts](../../cc.ts) — main plugin class (public API surface)