@webex/contact-center 3.12.0-llmrefactor.1 → 3.12.0-llmrefactor.11

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 (198) hide show
  1. package/.sdd/manifest.json +7 -5
  2. package/ai-docs/ARCHITECTURE.md +1 -1
  3. package/ai-docs/CONTRACTS.md +8 -3
  4. package/ai-docs/SECURITY.md +1 -1
  5. package/ai-docs/contact-center-spec.md +22 -4
  6. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  7. package/dist/cc.js +544 -12
  8. package/dist/cc.js.map +1 -1
  9. package/dist/config.js +7 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +10 -2
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/metrics/MetricsManager.js +16 -0
  15. package/dist/metrics/MetricsManager.js.map +1 -1
  16. package/dist/metrics/behavioral-events.js +104 -0
  17. package/dist/metrics/behavioral-events.js.map +1 -1
  18. package/dist/metrics/constants.js +18 -0
  19. package/dist/metrics/constants.js.map +1 -1
  20. package/dist/services/AddressBook.js +18 -15
  21. package/dist/services/AddressBook.js.map +1 -1
  22. package/dist/services/AnswerCallOnWebexService.js +202 -0
  23. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  24. package/dist/services/EntryPoint.js +46 -68
  25. package/dist/services/EntryPoint.js.map +1 -1
  26. package/dist/services/Queue.js +27 -22
  27. package/dist/services/Queue.js.map +1 -1
  28. package/dist/services/WebexCrossClientService.js +222 -0
  29. package/dist/services/WebexCrossClientService.js.map +1 -0
  30. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  31. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  32. package/dist/services/config/Util.js +3 -0
  33. package/dist/services/config/Util.js.map +1 -1
  34. package/dist/services/config/constants.js +10 -6
  35. package/dist/services/config/constants.js.map +1 -1
  36. package/dist/services/config/types.js +4 -0
  37. package/dist/services/config/types.js.map +1 -1
  38. package/dist/services/core/Err.js.map +1 -1
  39. package/dist/services/core/WebexRequest.js +6 -2
  40. package/dist/services/core/WebexRequest.js.map +1 -1
  41. package/dist/services/core/aqm-reqs.js +28 -14
  42. package/dist/services/core/aqm-reqs.js.map +1 -1
  43. package/dist/services/core/types.js.map +1 -1
  44. package/dist/services/task/Task.js +73 -7
  45. package/dist/services/task/Task.js.map +1 -1
  46. package/dist/services/task/TaskFactory.js +8 -4
  47. package/dist/services/task/TaskFactory.js.map +1 -1
  48. package/dist/services/task/TaskManager.js +490 -21
  49. package/dist/services/task/TaskManager.js.map +1 -1
  50. package/dist/services/task/WebexCallingUtils.js +70 -0
  51. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  52. package/dist/services/task/constants.js +4 -1
  53. package/dist/services/task/constants.js.map +1 -1
  54. package/dist/services/task/contact.js +29 -0
  55. package/dist/services/task/contact.js.map +1 -1
  56. package/dist/services/task/digital/Digital.js +3 -2
  57. package/dist/services/task/digital/Digital.js.map +1 -1
  58. package/dist/services/task/state-machine/TaskStateMachine.js +162 -53
  59. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  60. package/dist/services/task/state-machine/actions.js +6 -1
  61. package/dist/services/task/state-machine/actions.js.map +1 -1
  62. package/dist/services/task/state-machine/guards.js +7 -10
  63. package/dist/services/task/state-machine/guards.js.map +1 -1
  64. package/dist/services/task/state-machine/types.js.map +1 -1
  65. package/dist/services/task/state-machine/uiControlsComputer.js +118 -18
  66. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  67. package/dist/services/task/types.js +16 -1
  68. package/dist/services/task/types.js.map +1 -1
  69. package/dist/services/task/voice/Voice.js +456 -15
  70. package/dist/services/task/voice/Voice.js.map +1 -1
  71. package/dist/services/task/voice/WebRTC.js +4 -1
  72. package/dist/services/task/voice/WebRTC.js.map +1 -1
  73. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  74. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  75. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  76. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  77. package/dist/services/wxAppTelephonyUtils.js +19 -0
  78. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  79. package/dist/types/cc.d.ts +78 -4
  80. package/dist/types/config.d.ts +7 -0
  81. package/dist/types/constants.d.ts +8 -0
  82. package/dist/types/index.d.ts +3 -1
  83. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  84. package/dist/types/metrics/constants.d.ts +17 -0
  85. package/dist/types/services/AddressBook.d.ts +2 -1
  86. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  87. package/dist/types/services/EntryPoint.d.ts +7 -5
  88. package/dist/types/services/Queue.d.ts +5 -3
  89. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  90. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  91. package/dist/types/services/config/constants.d.ts +8 -5
  92. package/dist/types/services/config/types.d.ts +17 -4
  93. package/dist/types/services/core/Err.d.ts +2 -0
  94. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  95. package/dist/types/services/core/types.d.ts +2 -0
  96. package/dist/types/services/task/Task.d.ts +20 -2
  97. package/dist/types/services/task/TaskFactory.d.ts +2 -1
  98. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  99. package/dist/types/services/task/constants.d.ts +3 -0
  100. package/dist/types/services/task/contact.d.ts +4 -0
  101. package/dist/types/services/task/digital/Digital.d.ts +2 -2
  102. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +304 -56
  103. package/dist/types/services/task/state-machine/guards.d.ts +6 -5
  104. package/dist/types/services/task/state-machine/types.d.ts +9 -1
  105. package/dist/types/services/task/types.d.ts +81 -4
  106. package/dist/types/services/task/voice/Voice.d.ts +52 -9
  107. package/dist/types/services/task/voice/WebRTC.d.ts +2 -2
  108. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  109. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  110. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  111. package/dist/types/types.d.ts +14 -8
  112. package/dist/types/utils/PageCache.d.ts +20 -3
  113. package/dist/types.js +7 -2
  114. package/dist/types.js.map +1 -1
  115. package/dist/utils/PageCache.js +19 -5
  116. package/dist/utils/PageCache.js.map +1 -1
  117. package/dist/webex.js +1 -1
  118. package/package.json +8 -8
  119. package/src/cc.ts +657 -12
  120. package/src/config.ts +7 -0
  121. package/src/constants.ts +8 -0
  122. package/src/index.ts +2 -0
  123. package/src/metrics/MetricsManager.ts +16 -0
  124. package/src/metrics/ai-docs/metrics-spec.md +78 -10
  125. package/src/metrics/behavioral-events.ts +106 -0
  126. package/src/metrics/constants.ts +20 -0
  127. package/src/services/AddressBook.ts +17 -6
  128. package/src/services/AnswerCallOnWebexService.ts +239 -0
  129. package/src/services/EntryPoint.ts +59 -60
  130. package/src/services/Queue.ts +29 -12
  131. package/src/services/WebexCrossClientService.ts +293 -0
  132. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  133. package/src/services/agent/ai-docs/agent-spec.md +1 -0
  134. package/src/services/ai-docs/AGENTS.md +10 -10
  135. package/src/services/ai-docs/services-spec.md +6 -1
  136. package/src/services/config/Util.ts +3 -0
  137. package/src/services/config/ai-docs/AGENTS.md +1 -1
  138. package/src/services/config/ai-docs/ARCHITECTURE.md +2 -2
  139. package/src/services/config/ai-docs/config-spec.md +6 -0
  140. package/src/services/config/constants.ts +10 -6
  141. package/src/services/config/types.ts +16 -4
  142. package/src/services/core/Err.ts +1 -0
  143. package/src/services/core/WebexRequest.ts +3 -1
  144. package/src/services/core/ai-docs/core-spec.md +5 -1
  145. package/src/services/core/aqm-reqs.ts +30 -15
  146. package/src/services/core/types.ts +2 -0
  147. package/src/services/task/Task.ts +79 -8
  148. package/src/services/task/TaskFactory.ts +8 -3
  149. package/src/services/task/TaskManager.ts +716 -17
  150. package/src/services/task/WebexCallingUtils.ts +136 -0
  151. package/src/services/task/ai-docs/ARCHITECTURE.md +1 -0
  152. package/src/services/task/ai-docs/task-spec.md +156 -3
  153. package/src/services/task/constants.ts +3 -0
  154. package/src/services/task/contact.ts +30 -0
  155. package/src/services/task/digital/Digital.ts +4 -2
  156. package/src/services/task/state-machine/TaskStateMachine.ts +235 -81
  157. package/src/services/task/state-machine/actions.ts +5 -2
  158. package/src/services/task/state-machine/ai-docs/AGENTS.md +6 -4
  159. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +35 -16
  160. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +103 -33
  161. package/src/services/task/state-machine/guards.ts +7 -10
  162. package/src/services/task/state-machine/types.ts +16 -1
  163. package/src/services/task/state-machine/uiControlsComputer.ts +206 -32
  164. package/src/services/task/types.ts +114 -4
  165. package/src/services/task/voice/Voice.ts +595 -14
  166. package/src/services/task/voice/WebRTC.ts +5 -1
  167. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  168. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  169. package/src/services/wxAppTelephonyUtils.ts +14 -0
  170. package/src/types.ts +33 -9
  171. package/src/utils/AGENTS.md +21 -10
  172. package/src/utils/PageCache.ts +38 -5
  173. package/src/utils/ai-docs/utils-spec.md +21 -11
  174. package/test/unit/spec/cc.ts +1522 -19
  175. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  176. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  177. package/test/unit/spec/services/AddressBook.ts +37 -6
  178. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  179. package/test/unit/spec/services/EntryPoint.ts +87 -40
  180. package/test/unit/spec/services/Queue.ts +123 -12
  181. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  182. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  183. package/test/unit/spec/services/config/Util.ts +85 -0
  184. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  185. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  186. package/test/unit/spec/services/task/Task.ts +274 -6
  187. package/test/unit/spec/services/task/TaskFactory.ts +39 -2
  188. package/test/unit/spec/services/task/TaskManager.ts +1717 -9
  189. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  190. package/test/unit/spec/services/task/contact.ts +33 -0
  191. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1485 -109
  192. package/test/unit/spec/services/task/state-machine/guards.ts +210 -8
  193. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +445 -7
  194. package/test/unit/spec/services/task/voice/Voice.ts +1412 -0
  195. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  196. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  197. package/umd/contact-center.min.js +2 -2
  198. package/umd/contact-center.min.js.map +1 -1
package/src/config.ts CHANGED
@@ -31,6 +31,13 @@ export default {
31
31
  * @default false
32
32
  */
33
33
  disableWebRTCRegistration: false,
34
+ /**
35
+ * Whether wxApp Better Together is enabled at SDK init.
36
+ * Must be set before SDK init. Default false (WXCC-6026).
37
+ * @type {boolean}
38
+ * @default false
39
+ */
40
+ enableWxBetterTogether: false,
34
41
  /**
35
42
  * The type of client making the connection.
36
43
  * @type {string}
package/src/constants.ts CHANGED
@@ -15,6 +15,7 @@ export const WEBEX_REQUEST_FILE = 'WebexRequest';
15
15
  export const TASK_MANAGER_FILE = 'TaskManager';
16
16
  export const TASK_FILE = 'Task';
17
17
  // AGENT OUTDIAL CONSTANTS
18
+ export const INBOUND_DIRECTION = 'INBOUND';
18
19
  export const OUTDIAL_DIRECTION = 'OUTBOUND';
19
20
  export const ATTRIBUTES = {};
20
21
  export const OUTDIAL_MEDIA_TYPE = 'telephony';
@@ -56,9 +57,11 @@ export const METHODS = {
56
57
  TRANSFER_CALL: 'transfer',
57
58
  CONSULT_TRANSFER: 'consultTransfer',
58
59
  CONSULT_CONFERENCE: 'consultConference',
60
+ DROP_CONFERENCE_PARTICIPANT: 'dropConferenceParticipant',
59
61
  EXIT_CONFERENCE: 'exitConference',
60
62
  TRANSFER_CONFERENCE: 'transferConference',
61
63
  TOGGLE_MUTE: 'toggleMute',
64
+ TRANSMIT_DTMF: 'transmitDtmf',
62
65
  COMPLETE_TRANSFER: 'completeTransfer',
63
66
  GET_OUTDIAL_ANI_ENTRIES: 'getOutdialAniEntries',
64
67
  ACCEPT_PREVIEW_CONTACT: 'acceptPreviewContact',
@@ -69,4 +72,9 @@ export const METHODS = {
69
72
  GET_REAL_TIME_ASSISTANCE: 'getRealTimeAssistance',
70
73
  SEND_REAL_TIME_ASSISTANCE_USER_ACTION: 'sendRealTimeAssistanceUserAction',
71
74
  FETCH_HISTORIC_TRANSCRIPTS: 'fetchHistoricTranscripts',
75
+ SET_MANAGE_WEBEX_CALLING_IN_WXCC: 'setManageWebexCallingInWxcc',
76
+ IS_WX_BETTER_TOGETHER_ENABLED: 'isWxBetterTogetherEnabled',
77
+ SYNC_WXAPP_MUTE_FROM_MERCURY: 'syncWxAppMuteFromMercury',
78
+ GET_CALL_DETAILS_ON_WEBEX: 'getCallDetailsOnWebex',
79
+ ENSURE_WXAPP_MERCURY_CONNECTED: 'ensureWxAppMercuryConnected',
72
80
  };
package/src/index.ts CHANGED
@@ -133,6 +133,8 @@ export type {
133
133
  TaskData,
134
134
  /** Task response */
135
135
  TaskResponse,
136
+ /** Conference participant drop request */
137
+ DropConferenceParticipantPayload,
136
138
  ConsultPayload,
137
139
  ConsultEndPayload,
138
140
  ConsultTransferPayLoad,
@@ -412,6 +412,22 @@ export default class MetricsManager {
412
412
  this.runningEvents[genericKey] = {startTime: Date.now(), keys: new Set(keyArray)};
413
413
  }
414
414
 
415
+ /**
416
+ * Clears a running timed event without emitting a metric.
417
+ * @param keys - A string or array of strings representing event keys (same as timeEvent).
418
+ * @public
419
+ */
420
+ public cancelTimedEvent(keys: string | string[]): void {
421
+ if (this.isMetricsDisabled()) {
422
+ return;
423
+ }
424
+ const keyArray = Array.isArray(keys) ? keys : [keys];
425
+ if (keyArray.length === 0) {
426
+ return;
427
+ }
428
+ delete this.runningEvents[keyArray[0]];
429
+ }
430
+
415
431
  /**
416
432
  * Sets the Webex SDK instance and marks the manager as ready when the SDK is ready.
417
433
  * @param webex - The Webex SDK instance.
@@ -35,6 +35,8 @@ Metrics is one of nine confirmed Contact Center SDK modules. Own timing, taxonom
35
35
 
36
36
  - **Behavioral Taxonomy**: Structured `product.agent.target.verb` naming convention for behavioral events
37
37
 
38
+ - **Webex Together behavioral naming**: Webex Together (wxApp) events use `*_webex_together` compound targets (e.g. `wxcc_sdk.user.task_accept_webex_together.complete`). Operational/business wire names remain `WXCC_SDK_WXAPP_*` unchanged.
39
+
38
40
  - **Payload Preparation**: Automatic cleanup of empty fields, space-to-underscore conversion, and `tabHidden` metadata
39
41
 
40
42
  - **AQM Response Helpers**: Static methods to extract common tracking fields from AQM responses
@@ -236,10 +238,19 @@ All event names are defined in `METRIC_EVENT_NAMES` (`constants.ts`). Events fol
236
238
  | `TASK_ACCEPT_CONSULT_SUCCESS` / `FAILED` | `'Task Accept Consult ...'` | Accept consult result |
237
239
  | `TASK_AUTO_ANSWER_SUCCESS` / `FAILED` | `'Task Auto Answer ...'` | Auto-answer result |
238
240
  | `TASK_OUTDIAL_SUCCESS` / `FAILED` | `'Task Outdial ...'` | Outdial result |
241
+ | `WXAPP_TASK_MUTE_SUCCESS` / `FAILED` | `'WxApp Task Mute ...'` | Webex Together task mute/unmute toggle (`wxcc_sdk.user.task_mute_webex_together.complete\|fail`). Mute telephony is queued per task via tail promise chain (`Voice.wxAppMuteToggleTail`) so concurrent toggles do not overwrite the shared `timeEvent` timer or reorder requests. |
242
+ | `WXAPP_TASK_DTMF_SUCCESS` / `FAILED` | `'WxApp Task Dtmf ...'` | Webex Together DTMF/keypad (`wxcc_sdk.user.task_dtmf_webex_together.complete\|fail`). DTMF telephony is queued per task via tail promise chain (`Voice.wxAppDtmfTail`) so concurrent keypad input does not overwrite the shared `timeEvent` timer or reorder digits. |
243
+ | `WXAPP_TASK_ACCEPT_SUCCESS` / `FAILED` | `'WxApp Task Accept ...'` | Webex Together accept/answer (`wxcc_sdk.user.task_accept_webex_together.complete\|fail`) |
244
+ | `WXAPP_TASK_DECLINE_SUCCESS` / `FAILED` | `'WxApp Task Decline ...'` | Webex Together reject/decline (`wxcc_sdk.user.task_reject_webex_together.complete\|fail`). Inbound offers: telephony `rejectCall` via `runWxAppReject`. wxApp outdial cancellations: CC `cancelTask` via `runWxAppOutdialDecline` (additive with `TASK_DECLINE_*`). Outdial failure payloads merge AQM `error.details` via `getCommonTrackingFieldForAQMResponseFailed` so wxApp metrics and diagnostic logs preserve `trackingId` / structured failure reason. |
245
+ | `WXAPP_SESSION_INIT_SUCCESS` / `FAILED` | `'WxApp Session Init ...'` | Webex Together session orchestration (`wxcc_sdk.user.webex_together_session_init.complete\|fail`) |
246
+ | `WXAPP_SESSION_SKIPPED` | `'WxApp Session Skipped'` | Webex Together session skipped (`wxcc_sdk.user.webex_together_session_init.ignore`) |
247
+ | `WXAPP_USERSUB_PUBLISH_SUCCESS` / `FAILED` | `'WxApp Usersub Publish ...'` | Cross-client usersub publish (`wxcc_sdk.user.webex_together_usersub_publish.complete\|fail`). Preflight failures (missing `userId` or device URL before HTTP publish) emit `WXAPP_USERSUB_PUBLISH_FAILED` with `skipReason` (`user_id_unavailable` / `device_url_unavailable`) and no `timeEvent` timer. Stale-generation discards (teardown or concurrent disable while HTTP publish is in flight) call `cancelTimedEvent` without emitting success/fail only when the completing publish still owns the active timer (`usersubPublishMetricsId` guard — a newer overlapping publish must not have its timer cleared). |
248
+ | `WXAPP_MERCURY_SUBSCRIBE_SUCCESS` / `FAILED` | `'WxApp Mercury Subscribe ...'` | Telephony Mercury mute-sync subscribe (`wxcc_sdk.user.webex_together_mercury_subscribe.complete\|fail`) |
239
249
  | `TASK_CONFERENCE_START_SUCCESS` / `FAILED` | `'Task Conference Start ...'` | Conference start result |
240
250
  | `TASK_CONFERENCE_END_SUCCESS` / `FAILED` | `'Task Conference End ...'` | Conference end result |
241
251
  | `TASK_CONFERENCE_TRANSFER_SUCCESS` / `FAILED` | `'Task Conference Transfer ...'` | Conference transfer result |
242
252
  | `TASK_CONFERENCE_EXIT_SUCCESS` / `FAILED` | `'Task Conference Exit ...'` | Conference exit result |
253
+ | `TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS` / `FAILED` | `'Task Conference Participant Drop ...'` | Participant Drop result |
243
254
  | `TASK_SWITCH_CALL_SUCCESS` / `FAILED` | `'Task Switch Call ...'` | Switch call result |
244
255
  | `WEBSOCKET_REGISTER_SUCCESS` / `FAILED` | `'Websocket Register ...'` | WebSocket registration result |
245
256
  | `WEBSOCKET_DEREGISTER_SUCCESS` / `FAIL` | `'Websocket Deregister ...'` | WebSocket deregistration result |
@@ -277,8 +288,16 @@ All event names are defined in `constants.ts` as `METRIC_EVENT_NAMES`. Events fo
277
288
  | Conference End | `TASK_CONFERENCE_END_SUCCESS` | `TASK_CONFERENCE_END_FAILED` |
278
289
  | Conference Transfer | `TASK_CONFERENCE_TRANSFER_SUCCESS` | `TASK_CONFERENCE_TRANSFER_FAILED` |
279
290
  | Conference Exit | `TASK_CONFERENCE_EXIT_SUCCESS` | `TASK_CONFERENCE_EXIT_FAILED` |
291
+ | Conference Participant Drop | `TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS` | `TASK_CONFERENCE_PARTICIPANT_DROP_FAILED` |
280
292
  | Switch Call | `TASK_SWITCH_CALL_SUCCESS` | `TASK_SWITCH_CALL_FAILED` |
281
293
  | Outdial | `TASK_OUTDIAL_SUCCESS` | `TASK_OUTDIAL_FAILED` |
294
+ | WxApp Task Mute | `WXAPP_TASK_MUTE_SUCCESS` | `WXAPP_TASK_MUTE_FAILED` |
295
+ | WxApp Task DTMF | `WXAPP_TASK_DTMF_SUCCESS` | `WXAPP_TASK_DTMF_FAILED` |
296
+ | WxApp Task Accept | `WXAPP_TASK_ACCEPT_SUCCESS` | `WXAPP_TASK_ACCEPT_FAILED` |
297
+ | WxApp Task Decline | `WXAPP_TASK_DECLINE_SUCCESS` | `WXAPP_TASK_DECLINE_FAILED` |
298
+ | WxApp Session Init | `WXAPP_SESSION_INIT_SUCCESS` | `WXAPP_SESSION_INIT_FAILED` |
299
+ | WxApp Usersub Publish | `WXAPP_USERSUB_PUBLISH_SUCCESS` | `WXAPP_USERSUB_PUBLISH_FAILED` |
300
+ | WxApp Mercury Subscribe | `WXAPP_MERCURY_SUBSCRIBE_SUCCESS` | `WXAPP_MERCURY_SUBSCRIBE_FAILED` |
282
301
  | Upload Logs | `UPLOAD_LOGS_SUCCESS` | `UPLOAD_LOGS_FAILED` |
283
302
  | WebSocket Deregister | `WEBSOCKET_DEREGISTER_SUCCESS` | `WEBSOCKET_DEREGISTER_FAIL` |
284
303
  | Device Type Update | `AGENT_DEVICE_TYPE_UPDATE_SUCCESS` | `AGENT_DEVICE_TYPE_UPDATE_FAILED` |
@@ -287,6 +306,22 @@ All event names are defined in `constants.ts` as `METRIC_EVENT_NAMES`. Events fo
287
306
  | Queue | `QUEUE_FETCH_SUCCESS` | `QUEUE_FETCH_FAILED` |
288
307
  | Outdial ANI Entries | `OUTDIAL_ANI_EP_FETCH_SUCCESS` | `OUTDIAL_ANI_EP_FETCH_FAILED` |
289
308
 
309
+ ### Webex Together behavioral taxonomy
310
+
311
+ Webex Together events (`WXAPP_*` constants) use `*_webex_together` compound targets. Assembled Amplitude names follow `wxcc_sdk.user.{target}.{verb}`:
312
+
313
+ | Feature | Behavioral target | Success name | Failure name | Skip name |
314
+ |---|---|---|---|---|
315
+ | Task accept / answer | `task_accept_webex_together` | `wxcc_sdk.user.task_accept_webex_together.complete` | `wxcc_sdk.user.task_accept_webex_together.fail` | — |
316
+ | Task reject / decline | `task_reject_webex_together` | `wxcc_sdk.user.task_reject_webex_together.complete` | `wxcc_sdk.user.task_reject_webex_together.fail` | — |
317
+ | Task mute / unmute toggle | `task_mute_webex_together` | `wxcc_sdk.user.task_mute_webex_together.complete` | `wxcc_sdk.user.task_mute_webex_together.fail` | — |
318
+ | Task DTMF / keypad | `task_dtmf_webex_together` | `wxcc_sdk.user.task_dtmf_webex_together.complete` | `wxcc_sdk.user.task_dtmf_webex_together.fail` | — |
319
+ | Usersub publish | `webex_together_usersub_publish` | `wxcc_sdk.user.webex_together_usersub_publish.complete` | `wxcc_sdk.user.webex_together_usersub_publish.fail` | — |
320
+ | Mercury subscribe | `webex_together_mercury_subscribe` | `wxcc_sdk.user.webex_together_mercury_subscribe.complete` | `wxcc_sdk.user.webex_together_mercury_subscribe.fail` | — |
321
+ | Session init | `webex_together_session_init` | `wxcc_sdk.user.webex_together_session_init.complete` | `wxcc_sdk.user.webex_together_session_init.fail` | `wxcc_sdk.user.webex_together_session_init.ignore` |
322
+
323
+ Operational and business wire names are unchanged (`WXCC_SDK_WXAPP_*`).
324
+
290
325
  Special events (no success/failure pair):
291
326
 
292
327
  - `AGENT_RONA` — has behavioral taxonomy (`service.agent_rona.set`)
@@ -297,11 +332,13 @@ Special events (no success/failure pair):
297
332
 
298
333
  - `WEBSOCKET_EVENT_RECEIVED` — **no** behavioral taxonomy (not in `eventTaxonomyMap`)
299
334
 
300
- Of the 80 defined metric names, 71 have behavioral taxonomy and 9 do not. Events **without** an `eventTaxonomyMap` entry are the six `AI_ASSISTANT_*` names plus `WEBSOCKET_DEREGISTER_SUCCESS`, `WEBSOCKET_DEREGISTER_FAIL`, and `WEBSOCKET_EVENT_RECEIVED`.
335
+ - `WXAPP_SESSION_SKIPPED` — has behavioral taxonomy (`wxcc_sdk.user.webex_together_session_init.ignore`)
336
+
337
+ Of the 107 defined metric names, 96 have behavioral taxonomy and 11 do not. Events **without** an `eventTaxonomyMap` entry are the eight `AI_ASSISTANT_*` names plus `WEBSOCKET_DEREGISTER_SUCCESS`, `WEBSOCKET_DEREGISTER_FAIL`, and `WEBSOCKET_EVENT_RECEIVED`.
301
338
 
302
339
  ### Complete METRIC_EVENT_NAMES catalog
303
340
 
304
- This table contains all 80 names from `src/metrics/constants.ts`; taxonomy presence is checked against `src/metrics/behavioral-events.ts`: 71 mapped and 9 unmapped.
341
+ This table contains all 107 names from `src/metrics/constants.ts`; taxonomy presence is checked against `src/metrics/behavioral-events.ts`: 96 mapped and 11 unmapped.
305
342
 
306
343
  | Constant | Emitted name | Behavioral taxonomy? |
307
344
  |---|---|---|
@@ -354,10 +391,27 @@ This table contains all 80 names from `src/metrics/constants.ts`; taxonomy prese
354
391
  | `TASK_CONFERENCE_TRANSFER_FAILED` | `Task Conference Transfer Failed` | yes |
355
392
  | `TASK_CONFERENCE_EXIT_SUCCESS` | `Task Conference Exit Success` | yes |
356
393
  | `TASK_CONFERENCE_EXIT_FAILED` | `Task Conference Exit Failed` | yes |
394
+ | `TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS` | `Task Conference Participant Drop Success` | yes |
395
+ | `TASK_CONFERENCE_PARTICIPANT_DROP_FAILED` | `Task Conference Participant Drop Failed` | yes |
357
396
  | `TASK_SWITCH_CALL_SUCCESS` | `Task Switch Call Success` | yes |
358
397
  | `TASK_SWITCH_CALL_FAILED` | `Task Switch Call Failed` | yes |
359
398
  | `TASK_OUTDIAL_SUCCESS` | `Task Outdial Success` | yes |
360
399
  | `TASK_OUTDIAL_FAILED` | `Task Outdial Failed` | yes |
400
+ | `WXAPP_TASK_MUTE_SUCCESS` | `WxApp Task Mute Success` | yes |
401
+ | `WXAPP_TASK_MUTE_FAILED` | `WxApp Task Mute Failed` | yes |
402
+ | `WXAPP_TASK_DTMF_SUCCESS` | `WxApp Task Dtmf Success` | yes |
403
+ | `WXAPP_TASK_DTMF_FAILED` | `WxApp Task Dtmf Failed` | yes |
404
+ | `WXAPP_TASK_ACCEPT_SUCCESS` | `WxApp Task Accept Success` | yes |
405
+ | `WXAPP_TASK_ACCEPT_FAILED` | `WxApp Task Accept Failed` | yes |
406
+ | `WXAPP_TASK_DECLINE_SUCCESS` | `WxApp Task Decline Success` | yes |
407
+ | `WXAPP_TASK_DECLINE_FAILED` | `WxApp Task Decline Failed` | yes |
408
+ | `WXAPP_SESSION_INIT_SUCCESS` | `WxApp Session Init Success` | yes |
409
+ | `WXAPP_SESSION_INIT_FAILED` | `WxApp Session Init Failed` | yes |
410
+ | `WXAPP_SESSION_SKIPPED` | `WxApp Session Skipped` | yes |
411
+ | `WXAPP_USERSUB_PUBLISH_SUCCESS` | `WxApp Usersub Publish Success` | yes |
412
+ | `WXAPP_USERSUB_PUBLISH_FAILED` | `WxApp Usersub Publish Failed` | yes |
413
+ | `WXAPP_MERCURY_SUBSCRIBE_SUCCESS` | `WxApp Mercury Subscribe Success` | yes |
414
+ | `WXAPP_MERCURY_SUBSCRIBE_FAILED` | `WxApp Mercury Subscribe Failed` | yes |
361
415
  | `UPLOAD_LOGS_SUCCESS` | `Upload Logs Success` | yes |
362
416
  | `UPLOAD_LOGS_FAILED` | `Upload Logs Failed` | yes |
363
417
  | `WEBSOCKET_DEREGISTER_SUCCESS` | `Websocket Deregister Success` | no |
@@ -381,12 +435,22 @@ This table contains all 80 names from `src/metrics/constants.ts`; taxonomy prese
381
435
  | `CAMPAIGN_PREVIEW_REMOVE_FAILED` | `Campaign Preview Remove Failed` | yes |
382
436
  | `AI_ASSISTANT_SEND_EVENT_SUCCESS` | `AI Assistant Send Event Success` | no |
383
437
  | `AI_ASSISTANT_SEND_EVENT_FAILED` | `AI Assistant Send Event Failed` | no |
384
- | `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_SUCCESS` | `AI Assistant Get Suggested Response Success` | no |
385
- | `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_FAILED` | `AI Assistant Get Suggested Response Failed` | no |
438
+ | `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS` | `AI Assistant Get Real Time Assistance Success` | no |
439
+ | `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED` | `AI Assistant Get Real Time Assistance Failed` | no |
440
+ | `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS` | `AI Assistant Send Real Time Assistance User Action Success` | no |
441
+ | `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED` | `AI Assistant Send Real Time Assistance User Action Failed` | no |
386
442
  | `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS` | `AI Assistant Fetch Historic Transcripts Success` | no |
387
443
  | `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED` | `AI Assistant Fetch Historic Transcripts Failed` | no |
444
+ | `USER_PREFERENCE_GET_SUCCESS` | `User Preference Get Success` | yes |
445
+ | `USER_PREFERENCE_GET_FAILED` | `User Preference Get Failed` | yes |
446
+ | `USER_PREFERENCE_CREATE_SUCCESS` | `User Preference Create Success` | yes |
447
+ | `USER_PREFERENCE_CREATE_FAILED` | `User Preference Create Failed` | yes |
448
+ | `USER_PREFERENCE_UPDATE_SUCCESS` | `User Preference Update Success` | yes |
449
+ | `USER_PREFERENCE_UPDATE_FAILED` | `User Preference Update Failed` | yes |
450
+ | `USER_PREFERENCE_DELETE_SUCCESS` | `User Preference Delete Success` | yes |
451
+ | `USER_PREFERENCE_DELETE_FAILED` | `User Preference Delete Failed` | yes |
388
452
 
389
- Defined names without an `eventTaxonomyMap` entry: `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED`, `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS`, `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_FAILED`, `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_SUCCESS`, `AI_ASSISTANT_SEND_EVENT_FAILED`, `AI_ASSISTANT_SEND_EVENT_SUCCESS`, `WEBSOCKET_DEREGISTER_FAIL`, `WEBSOCKET_DEREGISTER_SUCCESS`, `WEBSOCKET_EVENT_RECEIVED`.
453
+ Defined names without an `eventTaxonomyMap` entry: `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED`, `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS`, `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED`, `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS`, `AI_ASSISTANT_SEND_EVENT_FAILED`, `AI_ASSISTANT_SEND_EVENT_SUCCESS`, `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED`, `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS`, `WEBSOCKET_DEREGISTER_FAIL`, `WEBSOCKET_DEREGISTER_SUCCESS`, `WEBSOCKET_EVENT_RECEIVED`.
390
454
 
391
455
  ## Requires (dependencies)
392
456
  - `webex.internal.newMetrics` submission APIs
@@ -434,8 +498,10 @@ Each behavioral event maps to a structured taxonomy in `behavioral-events.ts`:
434
498
  > **Note**: The following events do **not** have behavioral taxonomy mappings in `behavioral-events.ts`:
435
499
  > - `AI_ASSISTANT_SEND_EVENT_SUCCESS`
436
500
  > - `AI_ASSISTANT_SEND_EVENT_FAILED`
437
- > - `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_SUCCESS`
438
- > - `AI_ASSISTANT_GET_SUGGESTED_RESPONSE_FAILED`
501
+ > - `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS`
502
+ > - `AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED`
503
+ > - `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS`
504
+ > - `AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED`
439
505
  > - `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS`
440
506
  > - `AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED`
441
507
  > - `WEBSOCKET_DEREGISTER_SUCCESS`
@@ -463,6 +529,8 @@ Example: `wxcc_sdk.user.station_login.complete`
463
529
 
464
530
  The mapping is defined in `behavioral-events.ts` via `eventTaxonomyMap` and accessed through `getEventTaxonomy(name)`.
465
531
 
532
+ Participant Drop uses target `task_conference_participant_drop` with `complete` for success and `fail` for failure. Its metric payload is limited to task/request correlation and standard AQM tracking fields; participant IDs, numbers, names, URLs, headers, and raw routing payloads are excluded.
533
+
466
534
  ```mermaid
467
535
  flowchart LR
468
536
  A[timeEvent keys] --> B[runningEvents stores startTime + key Set]
@@ -728,7 +796,7 @@ MetricsManager holds three pending queues, running timing entries, a readiness f
728
796
 
729
797
  ## Business Rules & Invariants
730
798
  - `timeEvent` and every tracking method return immediately while metrics are disabled.
731
- - Only names present in `eventTaxonomyMap` receive behavioral taxonomy; 71 of 80 names are mapped and the six AI Assistant plus three WebSocket names are intentionally catalogued as unmapped.
799
+ - Only names present in `eventTaxonomyMap` receive behavioral taxonomy; 73 of 82 names are mapped and the six AI Assistant plus three WebSocket names are intentionally catalogued as unmapped.
732
800
  - `submittingEvents` prevents overlapping queue-drain executions.
733
801
  - Authentication is inherited from the host Webex SDK's metrics client; MetricsManager owns no credentials, tokens, or authorization policy.
734
802
 
@@ -763,7 +831,7 @@ stateDiagram-v2
763
831
  - **metricsDisabled**: When `true`, `timeEvent` and all `track*` methods return early, and `clearPendingEvents()` empties all queues.
764
832
 
765
833
  ## Pitfalls
766
- - `METRIC_EVENT_NAMES` and `eventTaxonomyMap` are different inventories: nine defined names intentionally have no behavioral taxonomy.
834
+ - `METRIC_EVENT_NAMES` and `eventTaxonomyMap` are different inventories: eleven defined names intentionally have no behavioral taxonomy.
767
835
  - `setMetricsDisabled(true)` clears pending queues but does not create a delivery receipt; callers must not infer that previously submitted events were accepted.
768
836
  - Submission helpers hand events to `webex.internal.newMetrics` without a module-level retry/requeue policy, so telemetry must remain non-blocking and non-authoritative.
769
837
 
@@ -824,7 +892,7 @@ Use `test/unit/spec/metrics/MetricsManager.ts` for readiness queues, timing/trac
824
892
  | Behavior / Requirement | Existing test evidence | Gap |
825
893
  |---|---|---|
826
894
  | `METRICS-R-001` | `test/unit/spec/metrics/MetricsManager.ts` | Add a catalog parity assertion if constants change. |
827
- | `METRICS-R-002` | `test/unit/spec/metrics/behavioral-events.ts` | Keep explicit coverage for all nine unmapped names. |
895
+ | `METRICS-R-002` | `test/unit/spec/metrics/behavioral-events.ts` | Keep explicit coverage for all eleven unmapped names. |
828
896
  | `METRICS-R-003` | `test/unit/spec/metrics/MetricsManager.ts` | None. |
829
897
  | `METRICS-R-004` | `test/unit/spec/metrics/MetricsManager.ts` | None. |
830
898
  | `METRICS-R-005` | `test/unit/spec/metrics/MetricsManager.ts` | Authentication ownership is verified indirectly through the host metrics client. |
@@ -313,6 +313,98 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
313
313
  target: 'task_outdial',
314
314
  verb: 'fail',
315
315
  },
316
+ [METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS]: {
317
+ product,
318
+ agent: 'user',
319
+ target: 'task_mute_webex_together',
320
+ verb: 'complete',
321
+ },
322
+ [METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED]: {
323
+ product,
324
+ agent: 'user',
325
+ target: 'task_mute_webex_together',
326
+ verb: 'fail',
327
+ },
328
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS]: {
329
+ product,
330
+ agent: 'user',
331
+ target: 'task_dtmf_webex_together',
332
+ verb: 'complete',
333
+ },
334
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED]: {
335
+ product,
336
+ agent: 'user',
337
+ target: 'task_dtmf_webex_together',
338
+ verb: 'fail',
339
+ },
340
+
341
+ // Webex Together (wxApp)
342
+ [METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS]: {
343
+ product,
344
+ agent: 'user',
345
+ target: 'task_accept_webex_together',
346
+ verb: 'complete',
347
+ },
348
+ [METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED]: {
349
+ product,
350
+ agent: 'user',
351
+ target: 'task_accept_webex_together',
352
+ verb: 'fail',
353
+ },
354
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS]: {
355
+ product,
356
+ agent: 'user',
357
+ target: 'task_reject_webex_together',
358
+ verb: 'complete',
359
+ },
360
+ [METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]: {
361
+ product,
362
+ agent: 'user',
363
+ target: 'task_reject_webex_together',
364
+ verb: 'fail',
365
+ },
366
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS]: {
367
+ product,
368
+ agent: 'user',
369
+ target: 'webex_together_session_init',
370
+ verb: 'complete',
371
+ },
372
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED]: {
373
+ product,
374
+ agent: 'user',
375
+ target: 'webex_together_session_init',
376
+ verb: 'fail',
377
+ },
378
+ [METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED]: {
379
+ product,
380
+ agent: 'user',
381
+ target: 'webex_together_session_init',
382
+ verb: 'ignore',
383
+ },
384
+ [METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_SUCCESS]: {
385
+ product,
386
+ agent: 'user',
387
+ target: 'webex_together_usersub_publish',
388
+ verb: 'complete',
389
+ },
390
+ [METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED]: {
391
+ product,
392
+ agent: 'user',
393
+ target: 'webex_together_usersub_publish',
394
+ verb: 'fail',
395
+ },
396
+ [METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_SUCCESS]: {
397
+ product,
398
+ agent: 'user',
399
+ target: 'webex_together_mercury_subscribe',
400
+ verb: 'complete',
401
+ },
402
+ [METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED]: {
403
+ product,
404
+ agent: 'user',
405
+ target: 'webex_together_mercury_subscribe',
406
+ verb: 'fail',
407
+ },
316
408
 
317
409
  // Conference Tasks
318
410
  [METRIC_EVENT_NAMES.TASK_CONFERENCE_START_SUCCESS]: {
@@ -366,6 +458,20 @@ const eventTaxonomyMap: Record<string, BehavioralEventTaxonomy> = {
366
458
  verb: 'fail',
367
459
  },
368
460
 
461
+ // Conference Participant Drop
462
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS]: {
463
+ product,
464
+ agent: 'user',
465
+ target: 'task_conference_participant_drop',
466
+ verb: 'complete',
467
+ },
468
+ [METRIC_EVENT_NAMES.TASK_CONFERENCE_PARTICIPANT_DROP_FAILED]: {
469
+ product,
470
+ agent: 'user',
471
+ target: 'task_conference_participant_drop',
472
+ verb: 'fail',
473
+ },
474
+
369
475
  // Switch Call
370
476
  [METRIC_EVENT_NAMES.TASK_SWITCH_CALL_SUCCESS]: {
371
477
  product,
@@ -131,12 +131,32 @@ export const METRIC_EVENT_NAMES = {
131
131
  TASK_CONFERENCE_TRANSFER_FAILED: 'Task Conference Transfer Failed',
132
132
  TASK_CONFERENCE_EXIT_SUCCESS: 'Task Conference Exit Success',
133
133
  TASK_CONFERENCE_EXIT_FAILED: 'Task Conference Exit Failed',
134
+ TASK_CONFERENCE_PARTICIPANT_DROP_SUCCESS: 'Task Conference Participant Drop Success',
135
+ TASK_CONFERENCE_PARTICIPANT_DROP_FAILED: 'Task Conference Participant Drop Failed',
134
136
  TASK_SWITCH_CALL_SUCCESS: 'Task Switch Call Success',
135
137
  TASK_SWITCH_CALL_FAILED: 'Task Switch Call Failed',
136
138
 
137
139
  TASK_OUTDIAL_SUCCESS: 'Task Outdial Success',
138
140
  TASK_OUTDIAL_FAILED: 'Task Outdial Failed',
139
141
 
142
+ WXAPP_TASK_MUTE_SUCCESS: 'WxApp Task Mute Success',
143
+ WXAPP_TASK_MUTE_FAILED: 'WxApp Task Mute Failed',
144
+ WXAPP_TASK_DTMF_SUCCESS: 'WxApp Task Dtmf Success',
145
+ WXAPP_TASK_DTMF_FAILED: 'WxApp Task Dtmf Failed',
146
+
147
+ // WxApp Better Together
148
+ WXAPP_TASK_ACCEPT_SUCCESS: 'WxApp Task Accept Success',
149
+ WXAPP_TASK_ACCEPT_FAILED: 'WxApp Task Accept Failed',
150
+ WXAPP_TASK_DECLINE_SUCCESS: 'WxApp Task Decline Success',
151
+ WXAPP_TASK_DECLINE_FAILED: 'WxApp Task Decline Failed',
152
+ WXAPP_SESSION_INIT_SUCCESS: 'WxApp Session Init Success',
153
+ WXAPP_SESSION_INIT_FAILED: 'WxApp Session Init Failed',
154
+ WXAPP_SESSION_SKIPPED: 'WxApp Session Skipped',
155
+ WXAPP_USERSUB_PUBLISH_SUCCESS: 'WxApp Usersub Publish Success',
156
+ WXAPP_USERSUB_PUBLISH_FAILED: 'WxApp Usersub Publish Failed',
157
+ WXAPP_MERCURY_SUBSCRIBE_SUCCESS: 'WxApp Mercury Subscribe Success',
158
+ WXAPP_MERCURY_SUBSCRIBE_FAILED: 'WxApp Mercury Subscribe Failed',
159
+
140
160
  UPLOAD_LOGS_SUCCESS: 'Upload Logs Success',
141
161
  UPLOAD_LOGS_FAILED: 'Upload Logs Failed',
142
162
  WEBSOCKET_DEREGISTER_SUCCESS: 'Websocket Deregister Success',
@@ -74,7 +74,8 @@ export class AddressBook {
74
74
 
75
75
  /**
76
76
  * Fetches address book entries for a specific address book using the entry API
77
- * @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId
77
+ * @param {AddressBookEntrySearchParams} [params] - Search, pagination, and optional sort parameters
78
+ * including addressBookId. Sorting defaults to name ascending.
78
79
  * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries
79
80
  * @throws {Error} If the API call fails
80
81
  * @public
@@ -102,12 +103,21 @@ export class AddressBook {
102
103
  search,
103
104
  filter,
104
105
  attributes,
106
+ sortBy = 'name',
107
+ sortOrder = 'asc',
105
108
  } = params;
106
109
 
107
110
  // Use provided addressBookId or fall back to agent's address book
108
111
  const bookId = addressBookId || this.getAddressBookId();
109
112
  const orgId = this.webex.credentials.getOrgId();
110
- const isSearchRequest = !!(search || filter || attributes);
113
+ const hasCustomSort = sortBy !== 'name' || sortOrder !== 'asc';
114
+ const isSearchRequest = !!(search || filter || attributes || hasCustomSort);
115
+ const canUseCache = this.pageCache.canUseCache({
116
+ search,
117
+ filter,
118
+ attributes,
119
+ sortBy: hasCustomSort ? sortBy : undefined,
120
+ });
111
121
 
112
122
  LoggerProxy.info('Fetching address book entries', {
113
123
  module: 'AddressBook',
@@ -121,8 +131,8 @@ export class AddressBook {
121
131
  },
122
132
  });
123
133
 
124
- // Check if we can use cache for simple pagination (no search/filter/attributes)
125
- if (this.pageCache.canUseCache({search, filter, attributes})) {
134
+ // Default name-ascending pagination is cache-compatible; result-changing overrides are not.
135
+ if (canUseCache) {
126
136
  const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
127
137
  const cachedPage = this.pageCache.getCachedPage(cacheKey);
128
138
 
@@ -190,6 +200,7 @@ export class AddressBook {
190
200
  if (filter) queryParams.append('filter', filter);
191
201
  if (attributes) queryParams.append('attributes', attributes);
192
202
  if (search) queryParams.append('search', search);
203
+ if (sortBy) queryParams.append('sort', `${sortBy},${sortOrder.toUpperCase()}`);
193
204
 
194
205
  const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());
195
206
 
@@ -244,8 +255,8 @@ export class AddressBook {
244
255
  );
245
256
  }
246
257
 
247
- // Cache the page data for simple pagination (no search/filter/attributes)
248
- if (this.pageCache.canUseCache({search, filter, attributes}) && response.body?.data) {
258
+ // Cache only the invariant default-order pagination shape.
259
+ if (canUseCache && response.body?.data) {
249
260
  const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
250
261
  this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);
251
262