@webex/contact-center 3.12.0-next.13 → 3.12.0-next.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.sdd/manifest.json +884 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +53 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +52 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +382 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  19. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  20. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  21. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  22. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  23. package/ai-docs/patterns/testing-patterns.md +480 -0
  24. package/ai-docs/patterns/typescript-patterns.md +365 -0
  25. package/ai-docs/templates/README.md +102 -0
  26. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  27. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  28. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  29. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  30. package/ai-docs/templates/new-method/00-master.md +80 -0
  31. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  32. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  33. package/ai-docs/templates/new-method/03-tests.md +201 -0
  34. package/ai-docs/templates/new-method/04-validation.md +141 -0
  35. package/ai-docs/templates/new-service/00-master.md +109 -0
  36. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  37. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  38. package/ai-docs/templates/new-service/03-integration.md +178 -0
  39. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  40. package/ai-docs/templates/new-service/05-validation.md +145 -0
  41. package/dist/cc.js +971 -42
  42. package/dist/cc.js.map +1 -1
  43. package/dist/config.js +13 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/constants.js +31 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +45 -15
  48. package/dist/index.js.map +1 -1
  49. package/dist/metrics/MetricsManager.js +16 -0
  50. package/dist/metrics/MetricsManager.js.map +1 -1
  51. package/dist/metrics/behavioral-events.js +205 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +48 -4
  54. package/dist/metrics/constants.js.map +1 -1
  55. package/dist/services/AddressBook.js +18 -15
  56. package/dist/services/AddressBook.js.map +1 -1
  57. package/dist/services/AnswerCallOnWebexService.js +202 -0
  58. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  59. package/dist/services/ApiAiAssistant.js +269 -9
  60. package/dist/services/ApiAiAssistant.js.map +1 -1
  61. package/dist/services/EntryPoint.js +46 -68
  62. package/dist/services/EntryPoint.js.map +1 -1
  63. package/dist/services/Queue.js +27 -22
  64. package/dist/services/Queue.js.map +1 -1
  65. package/dist/services/UserPreference.js +427 -0
  66. package/dist/services/UserPreference.js.map +1 -0
  67. package/dist/services/WebexCrossClientService.js +222 -0
  68. package/dist/services/WebexCrossClientService.js.map +1 -0
  69. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  70. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  71. package/dist/services/config/Util.js +11 -4
  72. package/dist/services/config/Util.js.map +1 -1
  73. package/dist/services/config/constants.js +41 -7
  74. package/dist/services/config/constants.js.map +1 -1
  75. package/dist/services/config/index.js +51 -0
  76. package/dist/services/config/index.js.map +1 -1
  77. package/dist/services/config/types.js +57 -12
  78. package/dist/services/config/types.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +111 -32
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +28 -14
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/types.js.map +1 -1
  90. package/dist/services/index.js +1 -1
  91. package/dist/services/index.js.map +1 -1
  92. package/dist/services/task/Task.js +754 -0
  93. package/dist/services/task/Task.js.map +1 -0
  94. package/dist/services/task/TaskFactory.js +49 -0
  95. package/dist/services/task/TaskFactory.js.map +1 -0
  96. package/dist/services/task/TaskManager.js +1172 -521
  97. package/dist/services/task/TaskManager.js.map +1 -1
  98. package/dist/services/task/TaskUtils.js +211 -27
  99. package/dist/services/task/TaskUtils.js.map +1 -1
  100. package/dist/services/task/WebexCallingUtils.js +70 -0
  101. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  102. package/dist/services/task/constants.js +12 -2
  103. package/dist/services/task/constants.js.map +1 -1
  104. package/dist/services/task/contact.js +29 -0
  105. package/dist/services/task/contact.js.map +1 -1
  106. package/dist/services/task/dialer.js +78 -0
  107. package/dist/services/task/dialer.js.map +1 -1
  108. package/dist/services/task/digital/Digital.js +78 -0
  109. package/dist/services/task/digital/Digital.js.map +1 -0
  110. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  111. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  112. package/dist/services/task/state-machine/actions.js +572 -0
  113. package/dist/services/task/state-machine/actions.js.map +1 -0
  114. package/dist/services/task/state-machine/constants.js +161 -0
  115. package/dist/services/task/state-machine/constants.js.map +1 -0
  116. package/dist/services/task/state-machine/guards.js +379 -0
  117. package/dist/services/task/state-machine/guards.js.map +1 -0
  118. package/dist/services/task/state-machine/index.js +53 -0
  119. package/dist/services/task/state-machine/index.js.map +1 -0
  120. package/dist/services/task/state-machine/types.js +54 -0
  121. package/dist/services/task/state-machine/types.js.map +1 -0
  122. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  123. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  124. package/dist/services/task/taskDataNormalizer.js +99 -0
  125. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  126. package/dist/services/task/types.js +228 -5
  127. package/dist/services/task/types.js.map +1 -1
  128. package/dist/services/task/voice/Voice.js +1485 -0
  129. package/dist/services/task/voice/Voice.js.map +1 -0
  130. package/dist/services/task/voice/WebRTC.js +152 -0
  131. package/dist/services/task/voice/WebRTC.js.map +1 -0
  132. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  133. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  134. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  135. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  136. package/dist/services/wxAppTelephonyUtils.js +19 -0
  137. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  138. package/dist/types/cc.d.ts +193 -6
  139. package/dist/types/config.d.ts +13 -0
  140. package/dist/types/constants.d.ts +29 -1
  141. package/dist/types/index.d.ts +35 -8
  142. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  143. package/dist/types/metrics/constants.d.ts +43 -1
  144. package/dist/types/services/AddressBook.d.ts +2 -1
  145. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  146. package/dist/types/services/ApiAiAssistant.d.ts +56 -5
  147. package/dist/types/services/EntryPoint.d.ts +7 -5
  148. package/dist/types/services/Queue.d.ts +5 -3
  149. package/dist/types/services/UserPreference.d.ts +118 -0
  150. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  151. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  152. package/dist/types/services/config/constants.d.ts +34 -5
  153. package/dist/types/services/config/types.d.ts +197 -12
  154. package/dist/types/services/core/Err.d.ts +6 -0
  155. package/dist/types/services/core/Utils.d.ts +35 -13
  156. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  157. package/dist/types/services/core/types.d.ts +2 -0
  158. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  159. package/dist/types/services/core/websocket/types.d.ts +1 -1
  160. package/dist/types/services/index.d.ts +1 -1
  161. package/dist/types/services/task/Task.d.ts +175 -0
  162. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  163. package/dist/types/services/task/TaskUtils.d.ts +48 -2
  164. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  165. package/dist/types/services/task/constants.d.ts +10 -0
  166. package/dist/types/services/task/contact.d.ts +4 -0
  167. package/dist/types/services/task/dialer.d.ts +30 -0
  168. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  169. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  170. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  171. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  172. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  173. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  174. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  175. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  176. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  177. package/dist/types/services/task/types.d.ts +680 -66
  178. package/dist/types/services/task/voice/Voice.d.ts +227 -0
  179. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  180. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  181. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  182. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  183. package/dist/types/types.d.ts +205 -9
  184. package/dist/types/utils/PageCache.d.ts +20 -3
  185. package/dist/types/webex.d.ts +1 -0
  186. package/dist/types.js +162 -4
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/PageCache.js +19 -5
  189. package/dist/utils/PageCache.js.map +1 -1
  190. package/dist/webex.js +22 -2
  191. package/dist/webex.js.map +1 -1
  192. package/package.json +16 -12
  193. package/src/cc.ts +1289 -112
  194. package/src/config.ts +13 -0
  195. package/src/constants.ts +29 -1
  196. package/src/index.ts +36 -5
  197. package/src/metrics/MetricsManager.ts +16 -0
  198. package/src/metrics/ai-docs/AGENTS.md +350 -0
  199. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  200. package/src/metrics/ai-docs/metrics-spec.md +921 -0
  201. package/src/metrics/behavioral-events.ts +212 -0
  202. package/src/metrics/constants.ts +52 -4
  203. package/src/services/AddressBook.ts +17 -6
  204. package/src/services/AnswerCallOnWebexService.ts +239 -0
  205. package/src/services/ApiAiAssistant.ts +356 -9
  206. package/src/services/EntryPoint.ts +59 -60
  207. package/src/services/Queue.ts +29 -12
  208. package/src/services/UserPreference.ts +509 -0
  209. package/src/services/WebexCrossClientService.ts +293 -0
  210. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  211. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  212. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  213. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  214. package/src/services/ai-docs/AGENTS.md +386 -0
  215. package/src/services/ai-docs/services-spec.md +505 -0
  216. package/src/services/config/Util.ts +12 -3
  217. package/src/services/config/ai-docs/AGENTS.md +255 -0
  218. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  219. package/src/services/config/ai-docs/config-spec.md +686 -0
  220. package/src/services/config/constants.ts +46 -6
  221. package/src/services/config/index.ts +65 -0
  222. package/src/services/config/types.ts +197 -13
  223. package/src/services/core/Err.ts +3 -0
  224. package/src/services/core/Utils.ts +127 -37
  225. package/src/services/core/WebexRequest.ts +3 -1
  226. package/src/services/core/ai-docs/AGENTS.md +381 -0
  227. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  228. package/src/services/core/ai-docs/core-spec.md +787 -0
  229. package/src/services/core/aqm-reqs.ts +30 -15
  230. package/src/services/core/types.ts +2 -0
  231. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  232. package/src/services/core/websocket/types.ts +1 -1
  233. package/src/services/index.ts +1 -1
  234. package/src/services/task/Task.ts +908 -0
  235. package/src/services/task/TaskFactory.ts +60 -0
  236. package/src/services/task/TaskManager.ts +1419 -608
  237. package/src/services/task/TaskUtils.ts +303 -25
  238. package/src/services/task/WebexCallingUtils.ts +136 -0
  239. package/src/services/task/ai-docs/AGENTS.md +457 -0
  240. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  241. package/src/services/task/ai-docs/task-spec.md +1474 -0
  242. package/src/services/task/constants.ts +10 -0
  243. package/src/services/task/contact.ts +30 -0
  244. package/src/services/task/dialer.ts +80 -0
  245. package/src/services/task/digital/Digital.ts +97 -0
  246. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  247. package/src/services/task/state-machine/actions.ts +741 -0
  248. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  249. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  250. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  251. package/src/services/task/state-machine/constants.ts +172 -0
  252. package/src/services/task/state-machine/guards.ts +442 -0
  253. package/src/services/task/state-machine/index.ts +28 -0
  254. package/src/services/task/state-machine/types.ts +258 -0
  255. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  256. package/src/services/task/taskDataNormalizer.ts +137 -0
  257. package/src/services/task/types.ts +819 -70
  258. package/src/services/task/voice/Voice.ts +1851 -0
  259. package/src/services/task/voice/WebRTC.ts +191 -0
  260. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  261. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  262. package/src/services/wxAppTelephonyUtils.ts +14 -0
  263. package/src/types.ts +262 -11
  264. package/src/utils/AGENTS.md +289 -0
  265. package/src/utils/PageCache.ts +38 -5
  266. package/src/utils/ai-docs/utils-spec.md +391 -0
  267. package/src/webex.js +10 -0
  268. package/test/unit/spec/cc.ts +2210 -119
  269. package/test/unit/spec/logger-proxy.ts +70 -0
  270. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  271. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  272. package/test/unit/spec/services/AddressBook.ts +37 -6
  273. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  274. package/test/unit/spec/services/ApiAiAssistant.ts +311 -21
  275. package/test/unit/spec/services/EntryPoint.ts +87 -40
  276. package/test/unit/spec/services/Queue.ts +123 -12
  277. package/test/unit/spec/services/UserPreference.ts +401 -0
  278. package/test/unit/spec/services/WebCallingService.ts +7 -1
  279. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  280. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  281. package/test/unit/spec/services/config/Util.ts +129 -0
  282. package/test/unit/spec/services/config/index.ts +97 -29
  283. package/test/unit/spec/services/core/Utils.ts +425 -8
  284. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  285. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  286. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  287. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  288. package/test/unit/spec/services/task/Task.ts +745 -0
  289. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  290. package/test/unit/spec/services/task/TaskManager.ts +2518 -1494
  291. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  292. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  293. package/test/unit/spec/services/task/contact.ts +33 -0
  294. package/test/unit/spec/services/task/dialer.ts +190 -0
  295. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  296. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  297. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  298. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  299. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  300. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  301. package/test/unit/spec/services/task/voice/Voice.ts +2061 -0
  302. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  303. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  304. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  305. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  306. package/umd/contact-center.min.js +2 -2
  307. package/umd/contact-center.min.js.map +1 -1
  308. package/dist/services/task/index.js +0 -1525
  309. package/dist/services/task/index.js.map +0 -1
  310. package/dist/types/services/task/index.d.ts +0 -650
  311. package/src/services/task/index.ts +0 -1801
  312. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,391 @@
1
+ # Utils — SPEC
2
+
3
+ > Start here → root [`AGENTS.md`](../../../AGENTS.md) · router [`SPEC_INDEX.md`](../../../ai-docs/SPEC_INDEX.md) · system [`ARCHITECTURE.md`](../../../ai-docs/ARCHITECTURE.md). This is the module's canonical specification.
4
+
5
+ ## Metadata
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Module id | `utils` |
10
+ | Source path(s) | `src/utils` |
11
+ | Doc kind | Module spec |
12
+ | Coverage score | Partial (manifest-authoritative); 15/15 required document fields present |
13
+ | Generated from | `module-spec` @ SDLC template library `0.2.1` |
14
+ | generated_by / approved_by / updated_at | Codex generator / developer-approved follow-up review remediation / 2026-07-21 |
15
+ | Validation status | Follow-up validation passed (independent Claude fallback, 2026-07-21); coverage remains Partial |
16
+
17
+ ## Evidence Rules
18
+ Every requirement cites stable source and test file paths. Code/tests are the behavioral referee; routed source text supplies explicit intent and rationale. Missing or contradictory evidence blocks promotion.
19
+
20
+ ## Source Material Register
21
+ | Source material | Scope | Decision | Detail location or disposition |
22
+ |---|---|---|---|
23
+ | Reviewed prior module guides and architecture material | overview / architecture / API / tests | used and code-checked | Content is placed by meaning throughout this specification; exact routing remains in the manifest. |
24
+
25
+ ## Overview
26
+ Utils is one of nine confirmed Contact Center SDK modules. Own shared pagination contracts and the bounded in-memory page cache used by Contact Center data services. Existing reviewed documentation is migrated by meaning and code/tests remain the behavioral referee.
27
+
28
+ The utils scope currently provides shared pagination and cache behavior for contact-center data services:
29
+
30
+ - **Typed Pagination Contracts**: Reusable interfaces for response metadata and query params
31
+
32
+ - **Generic In-Memory Page Caching**: `PageCache<T>` utility for simple pagination reuse
33
+
34
+ - **Cache Safety Rules**: Explicit bypass behavior for search/filter/sort and enabled result/shape flags
35
+
36
+ - **Spec-Driven Utility Workflow**: Utility-specific implementation and validation flow documented inline in this file
37
+
38
+ | Component | File | Description |
39
+ |---|---|---|
40
+ | `PageCache` | [`PageCache.ts`](../PageCache.ts) | Generic in-memory cache utility for paginated API responses with TTL expiry and helper methods for key generation and cache eligibility checks. |
41
+ | `Pagination Types` | [`PageCache.ts`](../PageCache.ts) | `PaginationMeta`, `PaginatedResponse<T>`, `BaseSearchParams`, and `PageCacheEntry<T>` shared across data services. |
42
+ | `Pagination Defaults` | [`PageCache.ts`](../PageCache.ts) | `PAGINATION_DEFAULTS` (`PAGE`, `PAGE_SIZE`) used by services for consistent request defaults. |
43
+ | `Specs Workflow` | `ai-docs/utils-spec.md` | Canonical flow for spec-driven utility changes, acceptance criteria, and drift checks. |
44
+
45
+ ## Purpose / Responsibility
46
+ Own shared pagination contracts and the bounded in-memory page cache used by Contact Center data services.
47
+
48
+ ## Stack
49
+ TypeScript 5.4 generics, in-memory Map/clock, LoggerProxy, Jest consumer tests.
50
+
51
+ ## Folder / Package Structure
52
+ ```text
53
+ src/utils/
54
+ ├── AGENTS.md
55
+ ├── PageCache.ts
56
+ ```
57
+
58
+ ```text
59
+ src/utils/
60
+ ├── AGENTS.md # Preserved legacy, noncanonical utils guide
61
+ └── PageCache.ts # Generic cache + pagination contracts/defaults
62
+ ```
63
+
64
+ ## Key Files (source of truth)
65
+ | File | Holds |
66
+ |---|---|
67
+ | `src/utils/PageCache.ts` | Authoritative PageCache implementation plus pagination/cache contracts and defaults. |
68
+ | `src/types.ts` | Package-wide public response/search types that consume PageCache contracts; not a Utils implementation. |
69
+ | `src/services/AddressBook.ts` | Services-layer PageCache consumer. |
70
+ | `src/services/EntryPoint.ts` | Services-layer PageCache consumer. |
71
+ | `src/services/Queue.ts` | Services-layer PageCache consumer. |
72
+
73
+ ## Public Surface
74
+ | Surface | Availability | Source |
75
+ |---|---|---|
76
+ | `PageCache<T>` | exported from the Utils module file for internal service use; not re-exported by package root | `src/utils/PageCache.ts` |
77
+ | `PaginationMeta`, `PaginatedResponse<T>`, `BaseSearchParams` | exported by PageCache module and consumed by package-wide types | `src/utils/PageCache.ts`, `src/types.ts` |
78
+ | `PAGINATION_DEFAULTS`, `PageCacheEntry<T>`, `CacheValidationParams` | PageCache module exports; not package-root exports | `src/utils/PageCache.ts` |
79
+ | AddressBook/EntryPoint/Queue public response/search aliases | package-root exports whose definitions indirectly use PageCache contracts | `src/types.ts`, `src/index.ts` |
80
+
81
+ No claim is made that `src/types.ts`, AddressBook, EntryPoint, or Queue is implemented by Utils.
82
+
83
+ ## Requires (dependencies)
84
+ - LoggerProxy
85
+ - In-memory Map and wall clock
86
+ - AddressBook, EntryPoint, and Queue consumers
87
+
88
+ ## Requirements
89
+ | ID | WHAT | WHY | Source Evidence | Test / Example Evidence | Assumptions / Gaps | Confidence |
90
+ |---|---|---|---|---|---|---|
91
+ | UTILS-R-001 | Use cache only for simple pagination requests without search, filter, attributes, sortBy, or enabled desktop-profile/provisioning/single-object flags. Explicit `false` flags remain cache-compatible because they do not change the base result or response shape. | Parameterized or enabled variant queries cannot safely reuse a page keyed only by scope/page/pageSize, while a disabled boolean is semantically the same as omission. | `src/utils/PageCache.ts` | `test/unit/spec/services/AddressBook.ts`, `test/unit/spec/services/Queue.ts` | None. | PRESENT |
92
+ | UTILS-R-002 | Build cache keys from a caller-defined `scopeId` plus `page:pageSize`: `orgId` for EntryPoint/Queue and `bookId` for AddressBook. | Consumer scope and page boundaries prevent cross-scope or cross-page reuse. | `src/utils/PageCache.ts`, `src/services/AddressBook.ts`, `src/services/EntryPoint.ts`, `src/services/Queue.ts` | `test/unit/spec/services/AddressBook.ts`, `test/unit/spec/services/EntryPoint.ts`, `test/unit/spec/services/Queue.ts` | `PageCache.buildCacheKey` names its first implementation parameter `orgId`, but runtime callers establish the broader `scopeId` semantics. | PRESENT |
93
+ | UTILS-R-003 | Expire entries after the configured five-minute TTL and delete them on stale lookup. | Bounded staleness prevents indefinite reuse of remote service data. | `src/utils/PageCache.ts` | None | Direct fake-clock expiration coverage is absent from current consumer tests. | PRESENT |
94
+ | UTILS-R-004 | Cache data with total-page/record metadata and allow owning consumers to clear the cache. | Paginated services need consistent metadata without transferring ownership of remote records to the SDK. | `src/utils/PageCache.ts` | `test/unit/spec/services/AddressBook.ts` | Cache hit/miss and metadata are exercised through consumers; `clearCache()` has no direct assertion. | PRESENT |
95
+ | UTILS-R-005 | Accept already-fetched page values from consuming services and never store or process credentials; use the consumer's scope value only as part of the in-memory key. | Authentication remains in Services/Core and scope-separated keys prevent unrelated pages from colliding. | `src/utils/PageCache.ts`, `src/services/core/WebexRequest.ts`, `src/services/AddressBook.ts`, `src/services/EntryPoint.ts`, `src/services/Queue.ts` | `test/unit/spec/services/AddressBook.ts` | None; security/auth ownership is explicit. | PRESENT |
96
+ | UTILS-R-006 | Keep PageCache free of rollout flags; consuming services decide whether to invoke it and query parameters determine cache eligibility. | Cache correctness must depend on request shape, not hidden deployment state. | `src/utils/PageCache.ts` | `test/unit/spec/services/AddressBook.ts`, `test/unit/spec/services/Queue.ts` | None; rollout applicability is explicitly N/A. | PRESENT |
97
+
98
+ ## Design Overview
99
+ Utils separates its stable consumption boundary from collaborators so ownership and failure behavior stay explicit. Caching is intentionally limited to simple page browsing; search/filter/sort requests and enabled result/shape flags bypass cache to prevent incorrect reuse.
100
+
101
+ > **This is the authoritative documentation for the `src/utils` scope.** It covers shared pagination/cache contracts used by data services. For task routing and cross-service conventions, see the [root orchestrator AGENTS.md](../../../AGENTS.md).
102
+
103
+ Current consumers of `PageCache` and defaults:
104
+
105
+ | Consumer | File | Usage |
106
+ |---|---|---|
107
+ | `AddressBook` | [`../../services/AddressBook.ts`](../../services/AddressBook.ts) | Caches paged address-book responses |
108
+ | `EntryPoint` | [`../../services/EntryPoint.ts`](../../services/EntryPoint.ts) | Caches paged entry-point responses |
109
+ | `Queue` | [`../../services/Queue.ts`](../../services/Queue.ts) | Caches paged queue responses |
110
+ | `Public type contracts` | [`../../types.ts`](../../types.ts) | Re-exports pagination/search contracts into SDK-facing types |
111
+
112
+ Cross-scope mention:
113
+
114
+ - Services-layer docs reference utils caching contracts at [`../../services/ai-docs/services-spec.md`](../../services/ai-docs/services-spec.md).
115
+
116
+ ## Data Flow
117
+ ```mermaid
118
+ flowchart LR
119
+ Service[AddressBook / EntryPoint / Queue] --> Eligible{canUseCache params?}
120
+ Eligible -->|query variant or enabled result/shape flag| Backend[Fetch without cache]
121
+ Eligible -->|simple pagination| Key[buildCacheKey scopeId:page:pageSize]
122
+ Key --> Lookup[getCachedPage]
123
+ Lookup -->|fresh| Hit[Return cached page]
124
+ Lookup -->|missing or TTL expired| Backend
125
+ Backend --> Fetched{cache eligible and response has data?}
126
+ Fetched -->|yes| Store[cachePage data + total metadata]
127
+ Fetched -->|no| Result[Return uncached response]
128
+ Store --> Result
129
+ ```
130
+
131
+ ## Sequence Diagram(s)
132
+ Sequence coverage:
133
+
134
+ | Operation group | Diagram | Failure / recovery coverage |
135
+ |---|---|---|
136
+ | Eligible lookup, fetch, and store | Cache lifecycle | Advanced queries bypass cache; misses and expired entries fetch from the backend; failed backend calls never reach `cachePage`. |
137
+ | Explicit cache clearing | Clear all entries | `clearCache` removes all entries from that consumer-owned PageCache instance and logs the prior size. |
138
+
139
+ ### Cache lifecycle
140
+
141
+ ```mermaid
142
+ sequenceDiagram
143
+ participant Service as Data service
144
+ participant Cache as PageCache
145
+ participant API as Backend API
146
+ Service->>Cache: canUseCache(params)
147
+ alt simple pagination
148
+ Note over Service,Cache: scopeId = bookId (AddressBook) or orgId (EntryPoint/Queue)
149
+ Service->>Cache: buildCacheKey(scopeId, page, pageSize)
150
+ Service->>Cache: getCachedPage(key)
151
+ alt fresh hit
152
+ Cache-->>Service: PageCacheEntry
153
+ else miss or expired
154
+ Service->>API: fetch page
155
+ alt backend success with response data
156
+ API-->>Service: data + meta
157
+ Service->>Cache: cachePage(key, data, meta)
158
+ else backend rejection
159
+ API--xService: error
160
+ Note over Service,Cache: no cache write
161
+ else success without data
162
+ API-->>Service: response without data
163
+ Note over Service,Cache: return response without a cache write
164
+ end
165
+ end
166
+ else advanced query
167
+ Service->>API: fetch without cache
168
+ end
169
+ ```
170
+
171
+ ### Clear all entries
172
+
173
+ ```mermaid
174
+ sequenceDiagram
175
+ participant Owner as Consumer service
176
+ participant Cache as Its PageCache instance
177
+ participant Log as LoggerProxy
178
+ Owner->>Cache: clearCache()
179
+ Cache->>Cache: capture size, then Map.clear()
180
+ Cache->>Log: log cleared entry count
181
+ Cache-->>Owner: void
182
+ ```
183
+
184
+ ## Class / Component Relationships
185
+ ```mermaid
186
+ classDiagram
187
+ class PageCache~T~ {
188
+ +canUseCache(params) boolean
189
+ +buildCacheKey(scopeId, page, pageSize) string
190
+ +getCachedPage(key) PageCacheEntry
191
+ +cachePage(key, data, meta)
192
+ +clearCache()
193
+ +getCacheSize() number
194
+ }
195
+ class AddressBook
196
+ class EntryPoint
197
+ class Queue
198
+ AddressBook --> PageCache : consumes
199
+ EntryPoint --> PageCache : consumes
200
+ Queue --> PageCache : consumes
201
+ ```
202
+
203
+ ## Use Cases
204
+ - **UC-1 Cache eligibility:** AddressBook, EntryPoint, or Queue bypasses cache whenever search, filter, attributes, sort, or an enabled desktop-profile/provisioning/single-object flag is supplied; explicit `false` flags stay eligible. Evidence: `src/utils/PageCache.ts`, `test/unit/spec/services/AddressBook.ts`, `test/unit/spec/services/Queue.ts`.
205
+ - **UC-2 Cache-key construction:** a simple page lookup uses `<scopeId>:page:pageSize`; AddressBook supplies `bookId`, while EntryPoint and Queue supply `orgId`. Evidence: `src/utils/PageCache.ts`, `src/services/AddressBook.ts`, `src/services/EntryPoint.ts`, `src/services/Queue.ts`.
206
+ - **UC-3 TTL lookup/expiry:** a fresh cached entry is returned; an expired entry is deleted and treated as a miss. Evidence: `src/utils/PageCache.ts`; no direct expiration test currently exists.
207
+ - **UC-4 Page insertion and clearing:** successful page data and normalized totals are cached, while `clearCache()` removes all entries for that service instance. Evidence: `src/utils/PageCache.ts`; consumer tests cover insertion/hit behavior, but not direct clearing.
208
+
209
+ ## State Model
210
+ Utils retains only in-memory runtime state. Durable domain records remain owned by remote Webex services. State changes are driven by explicit calls, events, timers, or actor transitions documented below.
211
+
212
+ `PageCache<T>` provides a consistent caching model for paginated list APIs. It is optimized for simple page browsing and intentionally bypasses cache for parameterized query cases (`search`, `filter`, `attributes`, `sortBy`) and enabled result/shape flags (`desktopProfileFilter`, `provisioningView`, `singleObjectResponse`).
213
+
214
+ ```typescript
215
+ import PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';
216
+
217
+ const cache = new PageCache<MyItem>('MyService');
218
+
219
+ const page = PAGINATION_DEFAULTS.PAGE;
220
+ const pageSize = PAGINATION_DEFAULTS.PAGE_SIZE;
221
+ // AddressBook uses bookId; EntryPoint and Queue use orgId.
222
+ const scopeId = bookIdOrOrgId;
223
+ const cacheKey = cache.buildCacheKey(scopeId, page, pageSize);
224
+
225
+ // Include every supported result- or shape-changing input.
226
+ const canUseCache = cache.canUseCache({
227
+ search,
228
+ filter,
229
+ attributes,
230
+ sortBy,
231
+ desktopProfileFilter,
232
+ provisioningView,
233
+ singleObjectResponse,
234
+ });
235
+
236
+ if (canUseCache) {
237
+ const cachedEntry = cache.getCachedPage(cacheKey);
238
+ if (cachedEntry) {
239
+ return {
240
+ data: cachedEntry.data,
241
+ meta: {
242
+ page,
243
+ pageSize,
244
+ ...cachedEntry.totalMeta,
245
+ },
246
+ };
247
+ }
248
+ }
249
+
250
+ const response = await fetchPageFromApi();
251
+
252
+ if (canUseCache && response.data) {
253
+ cache.cachePage(cacheKey, response.data, response.meta);
254
+ }
255
+
256
+ return response;
257
+ ```
258
+
259
+ ```mermaid
260
+ graph TD
261
+ A[Request arrives with scopeId/page/pageSize] --> B{canUseCache?}
262
+ B -->|No: query variant or enabled result/shape flag| C[Bypass cache and call API]
263
+ B -->|Yes| D[buildCacheKey scopeId:page:pageSize]
264
+ D --> E["getCachedPage(cacheKey)"]
265
+ E -->|Miss| C
266
+ E -->|Hit and not expired| F[Return cached data and totalMeta]
267
+ E -->|Hit but expired >= 5 minutes| G[Delete entry and treat as miss]
268
+ G --> C
269
+ C --> H[Receive API response]
270
+ H --> K{canUseCache and response has data?}
271
+ K -->|Yes| I["cachePage(cacheKey, data, meta)"]
272
+ K -->|No| J[Return uncached response]
273
+ I --> J[Return fresh response]
274
+ ```
275
+
276
+ Creates a typed cache instance and stores `apiName` for `LoggerProxy` context.
277
+
278
+ Returns `true` only when all of these are absent:
279
+
280
+ - `search`
281
+
282
+ - `filter`
283
+
284
+ - `attributes`
285
+
286
+ - `sortBy`
287
+
288
+ - `desktopProfileFilter`, `provisioningView`, or `singleObjectResponse` when `true`
289
+
290
+ An explicit `false` boolean remains eligible because it is semantically identical to omitting that flag. Services must pass an effective `sortBy` whenever `sortOrder` changes the wire order; Queue normalizes a direction-only request to `sortBy=name` before cache validation.
291
+
292
+ Builds deterministic cache key format:
293
+
294
+ ```text
295
+ ${scopeId}:${page}:${pageSize}
296
+ ```
297
+
298
+ The implementation parameter is named `orgId`, but its value is the caller-defined `scopeId`: `bookId` in AddressBook and `orgId` in EntryPoint/Queue.
299
+
300
+ Behavior:
301
+
302
+ 1. Returns `null` if key not found
303
+
304
+ 2. Computes cache age in minutes
305
+
306
+ 3. If age is `>= 5`, logs expiry, deletes entry, returns `null`
307
+
308
+ 4. Otherwise returns cached entry
309
+
310
+ Stores entry with:
311
+
312
+ - `data`
313
+
314
+ - `timestamp`
315
+
316
+ - `totalMeta.totalPages`
317
+
318
+ - `totalMeta.totalRecords` mapped from `meta.totalRecords || meta.totalItems`
319
+
320
+ Clears all entries and logs cleared entry count.
321
+
322
+ Returns current in-memory entry count.
323
+
324
+ Note: `clearCache()` and `getCacheSize()` are available for future use and are not currently called by existing consumers.
325
+
326
+ ## Business Rules & Invariants
327
+ - Utils must preserve its typed public/event contracts and must not invent backend states or responses. Enforced in `src/utils/PageCache.ts`.
328
+ - Security/auth applicability is limited to scope separation: PageCache receives already-fetched values, owns no credentials, and includes its caller-supplied scope value in cache keys.
329
+ - Rollout applicability is N/A: PageCache has no feature flag; consumers choose whether to use it and `canUseCache` decides eligibility from query parameters.
330
+
331
+ ## Pitfalls
332
+ - Do not describe the first cache-key field as universally `orgId`: AddressBook passes `bookId`, while EntryPoint and Queue pass `orgId`.
333
+ - Do not cache queries containing `search`, `filter`, `attributes`, `sortBy`, or enabled desktop-profile/provisioning/single-object flags; their result set or shape is not represented in the key. Explicit `false` flags do not create a variant.
334
+ - Do not treat an expired entry as usable data. `getCachedPage` deletes it and returns `null`.
335
+ - Do not cache a rejected request or a response without data; only the consuming service owns the backend request and decides when to call `cachePage`.
336
+
337
+ ## Module Do's / Don'ts
338
+ - DO create a separate `PageCache` instance per consuming service and pass that consumer's stable scope value into `buildCacheKey`.
339
+ - DO preserve the five-minute `>=` expiry boundary and the `totalRecords || totalItems` compatibility mapping.
340
+ - DO keep credentials, request execution, and backend-error handling in the consuming service/Core layers.
341
+ - DON'T add query dimensions without either extending the cache key or making `canUseCache` bypass them.
342
+ - DON'T claim `clearCache()` or TTL expiry is directly unit-tested until dedicated assertions exist.
343
+
344
+ When changing `src/utils` behavior or contracts:
345
+
346
+ 1. Follow the workflow diagram below
347
+
348
+ 2. Define acceptance criteria for contract and runtime behavior
349
+
350
+ 3. Verify cache TTL, bypass rules, and key schema
351
+
352
+ 4. Validate no spec drift before shipping
353
+
354
+ ```mermaid
355
+ flowchart TD
356
+ A[Change proposed in src/utils] --> B{Classify change scope}
357
+ B -->|Contract change| C[Document expected API/type behavior]
358
+ B -->|Runtime behavior change| D[Document cache behavior and TTL impact]
359
+ B -->|Both| C
360
+ C --> E[Update canonical utils-spec contracts and consumer map]
361
+ D --> F[Validate cache key schema and bypass conditions]
362
+ E --> G[Run drift check against PageCache.ts and consumer services]
363
+ F --> G
364
+ G --> H{Behavior and docs aligned?}
365
+ H -->|No| I[Revise implementation/docs and re-validate]
366
+ I --> G
367
+ H -->|Yes| J[Prepare PR with acceptance criteria and evidence]
368
+ ```
369
+
370
+ ## Key Design Trade-off
371
+ - Caching is intentionally limited to simple page browsing; search/filter/sort requests bypass cache to prevent incorrect reuse.
372
+
373
+ ## Test-Case Strategy (module)
374
+ PageCache has no dedicated unit file; current consumer tests in `test/unit/spec/services/AddressBook.ts`, `EntryPoint.ts`, and `Queue.ts` cover request shaping plus cache hit/miss behavior. Add direct PageCache tests for the five-minute expiry boundary, entry deletion, metadata normalization, clearing, and key construction with both `bookId` and `orgId` scope values.
375
+
376
+ | Behavior / Requirement | Existing test evidence | Gap |
377
+ |---|---|---|
378
+ | `UTILS-R-001` | AddressBook, EntryPoint, and Queue consumer tests exercise advanced query parameters and simple pagination. | Add a direct `canUseCache` table test for each bypass field and `sortOrder` alone. |
379
+ | `UTILS-R-002` | AddressBook repeat/miss tests exercise `bookId`-scoped caching; EntryPoint and Queue miss tests exercise `orgId` consumers. | Add direct key-string assertions for both runtime scope kinds. |
380
+ | `UTILS-R-003` | None. | Add fake-clock tests at just below and exactly five minutes, including deletion. |
381
+ | `UTILS-R-004` | AddressBook verifies a repeat-call hit and response metadata; all three consumers verify misses. | Add direct metadata fallback and `clearCache`/`getCacheSize` assertions. |
382
+ | `UTILS-R-005` | Source inspection confirms PageCache has no credential or request dependency. | No runtime credential test is needed; retain the static ownership check. |
383
+ | `UTILS-R-006` | Source inspection confirms no feature-flag dependency; consumer tests cover invocation choices. | No direct rollout test is applicable. |
384
+
385
+ ## Traceability
386
+ - Repo architecture: `../../../ai-docs/ARCHITECTURE.md` · Registry: `../../../ai-docs/SPEC_INDEX.md`
387
+ - Coverage state and contracts baseline: `../../../.sdd/manifest.json`
388
+
389
+ - [Root orchestrator AGENTS.md](../../../AGENTS.md) - Task routing and critical package rules
390
+
391
+ - [PageCache implementation](../PageCache.ts)
package/src/webex.js CHANGED
@@ -9,6 +9,10 @@ import '@webex/internal-plugin-support';
9
9
  import './index';
10
10
 
11
11
  import config from './webex-config';
12
+ import {CC_AGENT_EVENTS} from './services/config/types';
13
+ import {WELLNESS_BREAK_NOTIFICATION_ACTIONS, WELLNESS_BREAK_USER_ACTIONS} from './types';
14
+
15
+ export * from './index';
12
16
 
13
17
  /**
14
18
  * Ensures global Buffer is defined, which is required for SDK functionality in some environments.
@@ -28,6 +32,12 @@ const Webex = WebexCore.extend({
28
32
  version: PACKAGE_VERSION,
29
33
  });
30
34
 
35
+ // The standalone UMD bundle exports the Webex constructor as its default value. Attach the
36
+ // public agent-event contract so browser samples can use the same constants as module consumers.
37
+ Webex.CC_AGENT_EVENTS = CC_AGENT_EVENTS;
38
+ Webex.WELLNESS_BREAK_NOTIFICATION_ACTIONS = WELLNESS_BREAK_NOTIFICATION_ACTIONS;
39
+ Webex.WELLNESS_BREAK_USER_ACTIONS = WELLNESS_BREAK_USER_ACTIONS;
40
+
31
41
  /**
32
42
  * Initializes a new Webex instance with merged configuration.
33
43
  *