@webex/contact-center 3.11.0 → 3.12.0-llmrefactor.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 (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
package/src/config.ts CHANGED
@@ -25,6 +25,12 @@ export default {
25
25
  * @default true
26
26
  */
27
27
  allowAutomatedRelogin: true,
28
+ /**
29
+ * Whether to skip Mobius/WebRTC registration for browser login flows.
30
+ * @type {boolean}
31
+ * @default false
32
+ */
33
+ disableWebRTCRegistration: false,
28
34
  /**
29
35
  * The type of client making the connection.
30
36
  * @type {string}
package/src/constants.ts CHANGED
@@ -42,11 +42,31 @@ export const METHODS = {
42
42
  HANDLE_DEVICE_TYPE: 'handleDeviceType',
43
43
  START_OUTDIAL: 'startOutdial',
44
44
  GET_QUEUES: 'getQueues',
45
- GET_OUTDIAL_ANI_ENTRIES: 'getOutdialAniEntries',
46
45
  UPLOAD_LOGS: 'uploadLogs',
47
46
  UPDATE_AGENT_PROFILE: 'updateAgentProfile',
48
47
  GET_DEVICE_ID: 'getDeviceId',
49
48
  HANDLE_INCOMING_TASK: 'handleIncomingTask',
50
49
  HANDLE_TASK_HYDRATE: 'handleTaskHydrate',
51
50
  INCOMING_TASK_LISTENER: 'incomingTaskListener',
51
+ ACCEPT: 'accept',
52
+ REJECT: 'decline',
53
+ HOLD: 'hold',
54
+ RESUME: 'resume',
55
+ HOLD_RESUME: 'holdResume',
56
+ TRANSFER_CALL: 'transfer',
57
+ CONSULT_TRANSFER: 'consultTransfer',
58
+ CONSULT_CONFERENCE: 'consultConference',
59
+ EXIT_CONFERENCE: 'exitConference',
60
+ TRANSFER_CONFERENCE: 'transferConference',
61
+ TOGGLE_MUTE: 'toggleMute',
62
+ COMPLETE_TRANSFER: 'completeTransfer',
63
+ GET_OUTDIAL_ANI_ENTRIES: 'getOutdialAniEntries',
64
+ ACCEPT_PREVIEW_CONTACT: 'acceptPreviewContact',
65
+ SKIP_PREVIEW_CONTACT: 'skipPreviewContact',
66
+ REMOVE_PREVIEW_CONTACT: 'removePreviewContact',
67
+ GET_BASE_URL: 'getBaseUrl',
68
+ SEND_EVENT: 'sendEvent',
69
+ GET_REAL_TIME_ASSISTANCE: 'getRealTimeAssistance',
70
+ SEND_REAL_TIME_ASSISTANCE_USER_ACTION: 'sendRealTimeAssistanceUserAction',
71
+ FETCH_HISTORIC_TRANSCRIPTS: 'fetchHistoricTranscripts',
52
72
  };
package/src/index.ts CHANGED
@@ -13,21 +13,22 @@ import ContactCenter from './cc';
13
13
  */
14
14
  export {default as ContactCenter} from './cc';
15
15
 
16
- // Service exports
17
16
  /**
18
- * Task class represents a contact center task that can be managed by an agent
17
+ * Agent routing service for Contact Center operations
19
18
  * @category Services
20
19
  */
21
- export {default as Task} from './services/task';
20
+ export {default as routingAgent} from './services/agent';
22
21
 
23
22
  /**
24
- * Agent routing service for Contact Center operations
23
+ * Task class represents a contact center task that can be managed by an agent
25
24
  * @category Services
26
25
  */
27
- export {default as routingAgent} from './services/agent';
26
+ export {default as Task} from './services/task/Task';
28
27
 
29
28
  // API exports (AddressBook is public, EntryPoint and Queue are accessed via cc wrappers)
30
29
  export {default as AddressBook} from './services/AddressBook';
30
+ export {default as ApiAIAssistant} from './services/ApiAiAssistant';
31
+ export {default as UserPreference} from './services/UserPreference';
31
32
 
32
33
  /** EntryPoint API types */
33
34
  export type {
@@ -124,6 +125,8 @@ export type {
124
125
  /** Task related types */
125
126
  export type {
126
127
  AgentContact,
128
+ /** Event emitter contract for task consumers (no @types/node needed) */
129
+ IEventEmitter,
127
130
  /** Task interface */
128
131
  ITask,
129
132
  Interaction,
@@ -138,8 +141,16 @@ export type {
138
141
  TransferPayLoad,
139
142
  ResumeRecordingPayload,
140
143
  WrapupPayLoad,
144
+ /** UI control types for task buttons */
145
+ InteractionUIControls,
146
+ TaskUILeg,
147
+ TaskUIControls,
148
+ TaskUIControlState,
141
149
  } from './services/task/types';
142
150
 
151
+ /** UI controls utilities */
152
+ export {getDefaultUIControls} from './services/task/state-machine/uiControlsComputer';
153
+
143
154
  /** Agent related types */
144
155
  export type {
145
156
  /** State change interface */
@@ -212,6 +223,14 @@ export type {
212
223
  DialPlan,
213
224
  /** Auxiliary code type (IDLE_CODE or WRAP_UP_CODE) */
214
225
  AuxCodeType,
226
+ /** User preference data structure */
227
+ UserPreference as UserPreferenceData,
228
+ /** Request payload for creating user preferences */
229
+ CreateUserPreferenceRequest,
230
+ /** Request payload for updating user preferences */
231
+ UpdateUserPreferenceRequest,
232
+ /** Query parameters for fetching user preferences */
233
+ GetUserPreferenceParams,
215
234
  } from './services/config/types';
216
235
 
217
236
  // Constants
@@ -0,0 +1,350 @@
1
+ # Metrics Module - AI Agent Guide
2
+
3
+ > **Legacy/reference-only.** Canonical SDD: [`metrics-spec.md`](metrics-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
+ > **Purpose**: Track behavioral, operational, and business metrics for Contact Center SDK operations using a singleton `MetricsManager`. Provides event timing, payload preparation, batching, and submission to the Webex metrics backend.
6
+
7
+ ---
8
+
9
+ ## Quick Start
10
+
11
+ ```typescript
12
+ import MetricsManager from '../metrics/MetricsManager';
13
+ import {METRIC_EVENT_NAMES} from '../metrics/constants';
14
+
15
+ // Get the singleton instance (webex is set during cc.register())
16
+ const metrics = MetricsManager.getInstance();
17
+
18
+ // Time an operation, then track its result
19
+ metrics.timeEvent(METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS);
20
+ // ... perform the operation ...
21
+ metrics.trackEvent(METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, {agentId: '123'});
22
+ ```
23
+
24
+ ---
25
+
26
+ ## Key Capabilities
27
+
28
+ - **Singleton Pattern**: Single `MetricsManager` instance shared across the entire SDK
29
+ - **Three Metric Types**: Behavioral (user actions), operational (system events), business (business-level analytics)
30
+ - **Event Timing**: `timeEvent` + `trackEvent` pattern automatically calculates `duration_ms`
31
+ - **Queued Submission**: Events are queued until the Webex SDK is ready, then submitted in order
32
+ - **Behavioral Taxonomy**: Structured `product.agent.target.verb` naming convention for behavioral events
33
+ - **Payload Preparation**: Automatic cleanup of empty fields, space-to-underscore conversion, and `tabHidden` metadata
34
+ - **AQM Response Helpers**: Static methods to extract common tracking fields from AQM responses
35
+
36
+ ---
37
+
38
+ ## API Reference
39
+
40
+ ### Methods
41
+
42
+ #### `MetricsManager.getInstance(options?)`
43
+
44
+ Returns the singleton instance. On first call with `{webex}`, binds to the Webex SDK and begins listening for the `ready` event.
45
+
46
+ **Parameters**:
47
+ - `options` (object, optional): `{webex: WebexSDK}` - The Webex SDK instance
48
+
49
+ **Returns**: `MetricsManager`
50
+
51
+ **Example**:
52
+ ```typescript
53
+ // During initialization (called internally by cc.register())
54
+ const metrics = MetricsManager.getInstance({webex});
55
+
56
+ // Subsequent calls (no webex needed)
57
+ const metrics = MetricsManager.getInstance();
58
+ ```
59
+
60
+ ---
61
+
62
+ #### `metrics.timeEvent(keys)`
63
+
64
+ Starts a timer for one or more event keys. When a matching `trackEvent` / `trackBehavioralEvent` / `trackOperationalEvent` / `trackBusinessEvent` is called, `duration_ms` is automatically added to the payload.
65
+
66
+ **Parameters**:
67
+ - `keys` (string | string[]): One or more `METRIC_EVENT_NAMES` values. The first key is the tracking key; all keys in the array will resolve the same timer.
68
+
69
+ **Returns**: `void`
70
+
71
+ **Example**:
72
+ ```typescript
73
+ // Single key
74
+ metrics.timeEvent(METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS);
75
+
76
+ // Multiple keys (success/failure share one timer)
77
+ metrics.timeEvent([
78
+ METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS,
79
+ METRIC_EVENT_NAMES.STATION_LOGIN_FAILED,
80
+ ]);
81
+ ```
82
+
83
+ ---
84
+
85
+ #### `metrics.trackEvent(name, payload?, metricServices?)`
86
+
87
+ Tracks an event across one or more metric services.
88
+
89
+ **Parameters**:
90
+ - `name` (METRIC_EVENT_NAMES): The event name constant
91
+ - `payload` (EventPayload, optional): Key-value pairs of event data
92
+ - `metricServices` (MetricsType[], optional): Array of `'behavioral'` | `'operational'` | `'business'` (default: `['behavioral']`)
93
+
94
+ **Returns**: `void`
95
+
96
+ **Example**:
97
+ ```typescript
98
+ // Behavioral only (default)
99
+ metrics.trackEvent(METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, {agentId: '123'});
100
+
101
+ // Multiple services
102
+ metrics.trackEvent(
103
+ METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS,
104
+ {interactionId: 'abc'},
105
+ ['behavioral', 'operational']
106
+ );
107
+ ```
108
+
109
+ ---
110
+
111
+ #### `metrics.trackBehavioralEvent(name, options?)`
112
+
113
+ Tracks a single behavioral event. Looks up the event taxonomy from `behavioral-events.ts` and submits via `webex.internal.newMetrics.submitBehavioralEvent`.
114
+
115
+ **Parameters**:
116
+ - `name` (METRIC_EVENT_NAMES): The event name
117
+ - `options` (EventPayload, optional): Additional payload data
118
+
119
+ **Returns**: `void`
120
+
121
+ ---
122
+
123
+ #### `metrics.trackOperationalEvent(name, options?)`
124
+
125
+ Tracks a single operational event. Prefixes the event name with `WXCC_SDK_` and submits via `webex.internal.newMetrics.submitOperationalEvent`.
126
+
127
+ **Parameters**:
128
+ - `name` (METRIC_EVENT_NAMES): The event name
129
+ - `options` (EventPayload, optional): Additional payload data
130
+
131
+ **Returns**: `void`
132
+
133
+ ---
134
+
135
+ #### `metrics.trackBusinessEvent(name, options?)`
136
+
137
+ Tracks a single business event. Prefixes the event name with `WXCC_SDK_` and submits via `webex.internal.newMetrics.submitBusinessEvent` with `appType: 'wxcc_sdk'`.
138
+
139
+ **Parameters**:
140
+ - `name` (METRIC_EVENT_NAMES): The event name
141
+ - `options` (EventPayload, optional): Additional payload data
142
+
143
+ **Returns**: `void`
144
+
145
+ ---
146
+
147
+ #### `metrics.setMetricsDisabled(disabled)`
148
+
149
+ Enables or disables metrics collection. When disabled, all pending events are cleared and new events are dropped.
150
+
151
+ **Parameters**:
152
+ - `disabled` (boolean): `true` to disable, `false` to enable
153
+
154
+ **Returns**: `void`
155
+
156
+ ---
157
+
158
+ #### `MetricsManager.getCommonTrackingFieldForAQMResponse(response)`
159
+
160
+ Static helper that extracts common tracking fields from an AQM success response.
161
+
162
+ **Parameters**:
163
+ - `response` (any): The AQM response object
164
+
165
+ **Returns**: `Record<string, any>` with fields: `agentId`, `agentSessionId`, `teamId`, `siteId`, `orgId`, `eventType`, `trackingId`, `notifTrackingId`
166
+
167
+ **Example**:
168
+ ```typescript
169
+ const fields = MetricsManager.getCommonTrackingFieldForAQMResponse(aqmResponse);
170
+ metrics.trackEvent(METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS, {
171
+ ...fields,
172
+ interactionId: task.interactionId,
173
+ });
174
+ ```
175
+
176
+ ---
177
+
178
+ #### `MetricsManager.getCommonTrackingFieldForAQMResponseFailed(failureResponse)`
179
+
180
+ Static helper that extracts common tracking fields from an AQM failure response.
181
+
182
+ **Parameters**:
183
+ - `failureResponse` (Failure): The AQM failure response object
184
+
185
+ **Returns**: `Record<string, any>` with fields: `agentId`, `trackingId`, `notifTrackingId`, `orgId`, `failureType`, `failureReason`, `reasonCode`
186
+
187
+ ---
188
+
189
+ #### `MetricsManager.resetInstance()`
190
+
191
+ Resets the singleton instance. Used for testing only.
192
+
193
+ **Returns**: `void`
194
+
195
+ ---
196
+
197
+ ## Metric Event Names
198
+
199
+ All event names are defined in `METRIC_EVENT_NAMES` (`constants.ts`). Events follow a `<Category> <Action> <Result>` pattern.
200
+
201
+ ### Agent Events
202
+
203
+ | Constant | Value | Description |
204
+ |----------|-------|-------------|
205
+ | `STATION_LOGIN_SUCCESS` | `'Station Login Success'` | Agent station login succeeded |
206
+ | `STATION_LOGIN_FAILED` | `'Station Login Failed'` | Agent station login failed |
207
+ | `STATION_LOGOUT_SUCCESS` | `'Station Logout Success'` | Agent station logout succeeded |
208
+ | `STATION_LOGOUT_FAILED` | `'Station Logout Failed'` | Agent station logout failed |
209
+ | `STATION_RELOGIN_SUCCESS` | `'Station Relogin Success'` | Silent relogin succeeded |
210
+ | `STATION_RELOGIN_FAILED` | `'Station Relogin Failed'` | Silent relogin failed |
211
+ | `AGENT_STATE_CHANGE_SUCCESS` | `'Agent State Change Success'` | State change succeeded |
212
+ | `AGENT_STATE_CHANGE_FAILED` | `'Agent State Change Failed'` | State change failed |
213
+ | `FETCH_BUDDY_AGENTS_SUCCESS` | `'Fetch Buddy Agents Success'` | Buddy agents fetch succeeded |
214
+ | `FETCH_BUDDY_AGENTS_FAILED` | `'Fetch Buddy Agents Failed'` | Buddy agents fetch failed |
215
+ | `AGENT_RONA` | `'Agent RONA'` | Agent Ring-On-No-Answer triggered |
216
+ | `AGENT_CONTACT_ASSIGN_FAILED` | `'Agent Contact Assign Failed'` | Contact assignment failed |
217
+ | `AGENT_INVITE_FAILED` | `'Agent Invite Failed'` | Agent invite failed |
218
+ | `AGENT_DEVICE_TYPE_UPDATE_SUCCESS` | `'Agent Device Type Update Success'` | Device type update succeeded |
219
+ | `AGENT_DEVICE_TYPE_UPDATE_FAILED` | `'Agent Device Type Update Failed'` | Device type update failed |
220
+
221
+ ### Task Events
222
+
223
+ | Constant | Value | Description |
224
+ |----------|-------|-------------|
225
+ | `TASK_ACCEPT_SUCCESS` / `FAILED` | `'Task Accept ...'` | Task accept result |
226
+ | `TASK_DECLINE_SUCCESS` / `FAILED` | `'Task Decline ...'` | Task decline result |
227
+ | `TASK_END_SUCCESS` / `FAILED` | `'Task End ...'` | Task end result |
228
+ | `TASK_WRAPUP_SUCCESS` / `FAILED` | `'Task Wrapup ...'` | Task wrapup result |
229
+ | `TASK_HOLD_SUCCESS` / `FAILED` | `'Task Hold ...'` | Task hold result |
230
+ | `TASK_RESUME_SUCCESS` / `FAILED` | `'Task Resume ...'` | Task resume result |
231
+ | `TASK_CONSULT_START_SUCCESS` / `FAILED` | `'Task Consult Start ...'` | Consult start result |
232
+ | `TASK_CONSULT_END_SUCCESS` / `FAILED` | `'Task Consult End ...'` | Consult end result |
233
+ | `TASK_TRANSFER_SUCCESS` / `FAILED` | `'Task Transfer ...'` | Transfer result |
234
+ | `TASK_PAUSE_RECORDING_SUCCESS` / `FAILED` | `'Task Pause Recording ...'` | Pause recording result |
235
+ | `TASK_RESUME_RECORDING_SUCCESS` / `FAILED` | `'Task Resume Recording ...'` | Resume recording result |
236
+ | `TASK_ACCEPT_CONSULT_SUCCESS` / `FAILED` | `'Task Accept Consult ...'` | Accept consult result |
237
+ | `TASK_AUTO_ANSWER_SUCCESS` / `FAILED` | `'Task Auto Answer ...'` | Auto-answer result |
238
+ | `TASK_OUTDIAL_SUCCESS` / `FAILED` | `'Task Outdial ...'` | Outdial result |
239
+
240
+ ### Conference Events
241
+
242
+ | Constant | Value | Description |
243
+ |----------|-------|-------------|
244
+ | `TASK_CONFERENCE_START_SUCCESS` / `FAILED` | `'Task Conference Start ...'` | Conference start result |
245
+ | `TASK_CONFERENCE_END_SUCCESS` / `FAILED` | `'Task Conference End ...'` | Conference end result |
246
+ | `TASK_CONFERENCE_TRANSFER_SUCCESS` / `FAILED` | `'Task Conference Transfer ...'` | Conference transfer result |
247
+ | `TASK_CONFERENCE_EXIT_SUCCESS` / `FAILED` | `'Task Conference Exit ...'` | Conference exit result |
248
+ | `TASK_SWITCH_CALL_SUCCESS` / `FAILED` | `'Task Switch Call ...'` | Switch call result |
249
+
250
+ ### System Events
251
+
252
+ | Constant | Value | Description |
253
+ |----------|-------|-------------|
254
+ | `WEBSOCKET_REGISTER_SUCCESS` / `FAILED` | `'Websocket Register ...'` | WebSocket registration result |
255
+ | `WEBSOCKET_DEREGISTER_SUCCESS` / `FAIL` | `'Websocket Deregister ...'` | WebSocket deregistration result |
256
+ | `WEBSOCKET_EVENT_RECEIVED` | `'Websocket Event Received'` | WebSocket event received |
257
+ | `UPLOAD_LOGS_SUCCESS` / `FAILED` | `'Upload Logs ...'` | Log upload result |
258
+
259
+ ### Data Fetch Events
260
+
261
+ | Constant | Value | Description |
262
+ |----------|-------|-------------|
263
+ | `ENTRYPOINT_FETCH_SUCCESS` / `FAILED` | `'Entrypoint Fetch ...'` | Entry point fetch result |
264
+ | `ADDRESSBOOK_FETCH_SUCCESS` / `FAILED` | `'AddressBook Fetch ...'` | Address book fetch result |
265
+ | `QUEUE_FETCH_SUCCESS` / `FAILED` | `'Queue Fetch ...'` | Queue fetch result |
266
+ | `OUTDIAL_ANI_EP_FETCH_SUCCESS` / `FAILED` | `'Outdial ANI Entries Fetch ...'` | Outdial ANI entries fetch result |
267
+
268
+ ---
269
+
270
+ ## Behavioral Event Taxonomy
271
+
272
+ Each behavioral event maps to a structured taxonomy in `behavioral-events.ts`:
273
+
274
+ ```
275
+ {product}.{agent}.{target}.{verb}
276
+ ```
277
+
278
+ - **product**: Always `'wxcc_sdk'` (from `PRODUCT_NAME`)
279
+ - **agent**: `'user'` for user-initiated actions, `'service'` for system-generated events
280
+ - **target**: Snake_case description of the action (e.g., `'station_login'`, `'task_accept'`)
281
+ - **verb**: `'complete'` for success, `'fail'` for failure, `'set'` for RONA events
282
+
283
+ **Example**: `STATION_LOGIN_SUCCESS` maps to `wxcc_sdk.user.station_login.complete`
284
+
285
+ > **Note**: The following events do **not** have behavioral taxonomy mappings in `behavioral-events.ts`:
286
+ > - `WEBSOCKET_DEREGISTER_SUCCESS`
287
+ > - `WEBSOCKET_DEREGISTER_FAIL`
288
+ > - `WEBSOCKET_EVENT_RECEIVED`
289
+ >
290
+ > Calling `trackBehavioralEvent` with these event names will push an event with an `undefined` taxonomy.
291
+
292
+ ---
293
+
294
+ ## Usage Pattern (timeEvent + trackEvent)
295
+
296
+ The standard pattern used throughout the Contact Center SDK:
297
+
298
+ ```typescript
299
+ const metrics = MetricsManager.getInstance();
300
+
301
+ // 1. Start timing before the operation
302
+ metrics.timeEvent([
303
+ METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS,
304
+ METRIC_EVENT_NAMES.STATION_LOGIN_FAILED,
305
+ ]);
306
+
307
+ try {
308
+ const response = await performLogin(params);
309
+
310
+ // 2a. Track success (duration_ms auto-added)
311
+ metrics.trackEvent(METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, {
312
+ ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),
313
+ });
314
+ } catch (error) {
315
+ // 2b. Track failure (duration_ms auto-added)
316
+ metrics.trackEvent(METRIC_EVENT_NAMES.STATION_LOGIN_FAILED, {
317
+ ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(error),
318
+ });
319
+ }
320
+ ```
321
+
322
+ ---
323
+
324
+ ## Error Handling
325
+
326
+ MetricsManager is designed to be non-blocking. Metric failures do not propagate to callers:
327
+
328
+ - If `webex` is not yet ready, events are queued in `pendingBehavioralEvents`, `pendingOperationalEvents`, or `pendingBusinessEvents`
329
+ - Once `webex.ready` fires, all pending events are flushed
330
+ - If metrics are disabled via `setMetricsDisabled(true)`, all track methods silently return
331
+ - Invalid metric types log an error via `LoggerProxy` but do not throw
332
+
333
+ ---
334
+
335
+ ## Dependencies
336
+
337
+ - **`@webex/internal-plugin-metrics`**: Provides `webex.internal.newMetrics` for actual metric submission (`submitBehavioralEvent`, `submitOperationalEvent`, `submitBusinessEvent`)
338
+ - **`LoggerProxy`**: Used for error logging within the metrics module
339
+ - **`Failure` type** (from `services/core/GlobalTypes`): Used in `getCommonTrackingFieldForAQMResponseFailed`
340
+ - **`PRODUCT_NAME`** (from `constants.ts`): Set to `'wxcc_sdk'`, used as the product identifier in behavioral taxonomy and as prefix for operational/business event names
341
+
342
+ ---
343
+
344
+ ## Related
345
+
346
+ - [`MetricsManager.ts`](../MetricsManager.ts) - Singleton metrics manager implementation
347
+ - [`behavioral-events.ts`](../behavioral-events.ts) - Event taxonomy mapping
348
+ - [`constants.ts`](../constants.ts) - `METRIC_EVENT_NAMES` definitions
349
+ - [`../../constants.ts`](../../constants.ts) - `PRODUCT_NAME` constant
350
+ - [`services/core/GlobalTypes.ts`](../../services/core/GlobalTypes.ts) - `Failure` type definition