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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/.sdd/manifest.json +883 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +50 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +359 -0
  17. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  18. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  19. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  20. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  21. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  22. package/ai-docs/patterns/testing-patterns.md +480 -0
  23. package/ai-docs/patterns/typescript-patterns.md +365 -0
  24. package/ai-docs/templates/README.md +102 -0
  25. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  26. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  27. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  28. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  29. package/ai-docs/templates/new-method/00-master.md +80 -0
  30. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  31. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  32. package/ai-docs/templates/new-method/03-tests.md +201 -0
  33. package/ai-docs/templates/new-method/04-validation.md +141 -0
  34. package/ai-docs/templates/new-service/00-master.md +109 -0
  35. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  36. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  37. package/ai-docs/templates/new-service/03-integration.md +178 -0
  38. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  39. package/ai-docs/templates/new-service/05-validation.md +145 -0
  40. package/dist/cc.js +818 -59
  41. package/dist/cc.js.map +1 -1
  42. package/dist/config.js +13 -0
  43. package/dist/config.js.map +1 -1
  44. package/dist/constants.js +31 -3
  45. package/dist/constants.js.map +1 -1
  46. package/dist/index.js +27 -5
  47. package/dist/index.js.map +1 -1
  48. package/dist/metrics/behavioral-events.js +127 -0
  49. package/dist/metrics/behavioral-events.js.map +1 -1
  50. package/dist/metrics/constants.js +34 -3
  51. package/dist/metrics/constants.js.map +1 -1
  52. package/dist/services/AddressBook.js +18 -15
  53. package/dist/services/AddressBook.js.map +1 -1
  54. package/dist/services/AnswerCallOnWebexService.js +174 -0
  55. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  56. package/dist/services/ApiAiAssistant.js +318 -0
  57. package/dist/services/ApiAiAssistant.js.map +1 -0
  58. package/dist/services/EntryPoint.js +46 -68
  59. package/dist/services/EntryPoint.js.map +1 -1
  60. package/dist/services/Queue.js +27 -22
  61. package/dist/services/Queue.js.map +1 -1
  62. package/dist/services/UserPreference.js +427 -0
  63. package/dist/services/UserPreference.js.map +1 -0
  64. package/dist/services/WebexCrossClientService.js +171 -0
  65. package/dist/services/WebexCrossClientService.js.map +1 -0
  66. package/dist/services/WxAppTelephonyMercurySync.js +93 -0
  67. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  68. package/dist/services/agent/types.js.map +1 -1
  69. package/dist/services/config/Util.js +11 -4
  70. package/dist/services/config/Util.js.map +1 -1
  71. package/dist/services/config/constants.js +45 -8
  72. package/dist/services/config/constants.js.map +1 -1
  73. package/dist/services/config/index.js +41 -2
  74. package/dist/services/config/index.js.map +1 -1
  75. package/dist/services/config/types.js +70 -8
  76. package/dist/services/config/types.js.map +1 -1
  77. package/dist/services/constants.js +27 -1
  78. package/dist/services/constants.js.map +1 -1
  79. package/dist/services/core/Err.js.map +1 -1
  80. package/dist/services/core/Utils.js +122 -25
  81. package/dist/services/core/Utils.js.map +1 -1
  82. package/dist/services/core/WebexRequest.js +6 -2
  83. package/dist/services/core/WebexRequest.js.map +1 -1
  84. package/dist/services/core/aqm-reqs.js +119 -30
  85. package/dist/services/core/aqm-reqs.js.map +1 -1
  86. package/dist/services/core/types.js.map +1 -1
  87. package/dist/services/core/websocket/WebSocketManager.js +22 -6
  88. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  89. package/dist/services/core/websocket/connection-service.js +3 -1
  90. package/dist/services/core/websocket/connection-service.js.map +1 -1
  91. package/dist/services/core/websocket/types.js.map +1 -1
  92. package/dist/services/index.js +6 -0
  93. package/dist/services/index.js.map +1 -1
  94. package/dist/services/task/Task.js +754 -0
  95. package/dist/services/task/Task.js.map +1 -0
  96. package/dist/services/task/TaskFactory.js +49 -0
  97. package/dist/services/task/TaskFactory.js.map +1 -0
  98. package/dist/services/task/TaskManager.js +1073 -447
  99. package/dist/services/task/TaskManager.js.map +1 -1
  100. package/dist/services/task/TaskUtils.js +220 -23
  101. package/dist/services/task/TaskUtils.js.map +1 -1
  102. package/dist/services/task/WebexCallingUtils.js +70 -0
  103. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  104. package/dist/services/task/constants.js +26 -2
  105. package/dist/services/task/constants.js.map +1 -1
  106. package/dist/services/task/contact.js +29 -0
  107. package/dist/services/task/contact.js.map +1 -1
  108. package/dist/services/task/dialer.js +129 -0
  109. package/dist/services/task/dialer.js.map +1 -1
  110. package/dist/services/task/digital/Digital.js +78 -0
  111. package/dist/services/task/digital/Digital.js.map +1 -0
  112. package/dist/services/task/state-machine/TaskStateMachine.js +971 -0
  113. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  114. package/dist/services/task/state-machine/actions.js +572 -0
  115. package/dist/services/task/state-machine/actions.js.map +1 -0
  116. package/dist/services/task/state-machine/constants.js +161 -0
  117. package/dist/services/task/state-machine/constants.js.map +1 -0
  118. package/dist/services/task/state-machine/guards.js +409 -0
  119. package/dist/services/task/state-machine/guards.js.map +1 -0
  120. package/dist/services/task/state-machine/index.js +53 -0
  121. package/dist/services/task/state-machine/index.js.map +1 -0
  122. package/dist/services/task/state-machine/types.js +54 -0
  123. package/dist/services/task/state-machine/types.js.map +1 -0
  124. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  125. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  126. package/dist/services/task/taskDataNormalizer.js +99 -0
  127. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  128. package/dist/services/task/types.js +243 -5
  129. package/dist/services/task/types.js.map +1 -1
  130. package/dist/services/task/voice/Voice.js +1380 -0
  131. package/dist/services/task/voice/Voice.js.map +1 -0
  132. package/dist/services/task/voice/WebRTC.js +152 -0
  133. package/dist/services/task/voice/WebRTC.js.map +1 -0
  134. package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
  135. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  136. package/dist/services/wxAppTelephonyUtils.js +19 -0
  137. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  138. package/dist/types/cc.d.ts +967 -0
  139. package/dist/types/config.d.ts +79 -0
  140. package/dist/types/constants.d.ts +74 -0
  141. package/dist/types/index.d.ts +201 -0
  142. package/dist/types/logger-proxy.d.ts +71 -0
  143. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  144. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  145. package/dist/types/metrics/constants.d.ts +183 -0
  146. package/dist/types/services/AddressBook.d.ts +75 -0
  147. package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
  148. package/dist/types/services/ApiAiAssistant.d.ts +49 -0
  149. package/dist/types/services/EntryPoint.d.ts +69 -0
  150. package/dist/types/services/Queue.d.ts +78 -0
  151. package/dist/types/services/UserPreference.d.ts +118 -0
  152. package/dist/types/services/WebCallingService.d.ts +1 -0
  153. package/dist/types/services/WebexCrossClientService.d.ts +28 -0
  154. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  155. package/dist/types/services/agent/index.d.ts +46 -0
  156. package/dist/types/services/agent/types.d.ts +413 -0
  157. package/dist/types/services/config/Util.d.ts +20 -0
  158. package/dist/types/services/config/constants.d.ts +273 -0
  159. package/dist/types/services/config/index.d.ts +177 -0
  160. package/dist/types/services/config/types.d.ts +1381 -0
  161. package/dist/types/services/constants.d.ts +110 -0
  162. package/dist/types/services/core/Err.d.ts +127 -0
  163. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  164. package/dist/types/services/core/Utils.d.ts +121 -0
  165. package/dist/types/services/core/WebexRequest.d.ts +23 -0
  166. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  167. package/dist/types/services/core/constants.d.ts +99 -0
  168. package/dist/types/services/core/types.d.ts +49 -0
  169. package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
  170. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  171. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  172. package/dist/types/services/core/websocket/types.d.ts +37 -0
  173. package/dist/types/services/index.d.ts +54 -0
  174. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  175. package/dist/types/services/task/Task.d.ts +175 -0
  176. package/dist/types/services/task/TaskFactory.d.ts +13 -0
  177. package/dist/types/services/task/TaskManager.d.ts +1 -0
  178. package/dist/types/services/task/TaskUtils.d.ts +138 -0
  179. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  180. package/dist/types/services/task/constants.d.ts +94 -0
  181. package/dist/types/services/task/contact.d.ts +73 -0
  182. package/dist/types/services/task/dialer.d.ts +73 -0
  183. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  184. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1398 -0
  185. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  186. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  187. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  188. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  189. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  190. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  191. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  192. package/dist/types/services/task/types.d.ts +1933 -0
  193. package/dist/types/services/task/voice/Voice.d.ts +223 -0
  194. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  195. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
  196. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  197. package/dist/types/types.d.ts +784 -0
  198. package/dist/types/utils/PageCache.d.ts +190 -0
  199. package/dist/types/webex-config.d.ts +53 -0
  200. package/dist/types/webex.d.ts +8 -0
  201. package/dist/types.js +137 -3
  202. package/dist/types.js.map +1 -1
  203. package/dist/utils/PageCache.js +19 -5
  204. package/dist/utils/PageCache.js.map +1 -1
  205. package/dist/webex.js +14 -2
  206. package/dist/webex.js.map +1 -1
  207. package/package.json +16 -12
  208. package/src/cc.ts +983 -60
  209. package/src/config.ts +13 -0
  210. package/src/constants.ts +29 -1
  211. package/src/index.ts +26 -5
  212. package/src/metrics/ai-docs/AGENTS.md +350 -0
  213. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  214. package/src/metrics/ai-docs/metrics-spec.md +860 -0
  215. package/src/metrics/behavioral-events.ts +134 -0
  216. package/src/metrics/constants.ts +39 -3
  217. package/src/services/AddressBook.ts +17 -6
  218. package/src/services/AnswerCallOnWebexService.ts +206 -0
  219. package/src/services/ApiAiAssistant.ts +412 -0
  220. package/src/services/EntryPoint.ts +59 -60
  221. package/src/services/Queue.ts +29 -12
  222. package/src/services/UserPreference.ts +509 -0
  223. package/src/services/WebexCrossClientService.ts +212 -0
  224. package/src/services/WxAppTelephonyMercurySync.ts +115 -0
  225. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  226. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  227. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  228. package/src/services/agent/types.ts +1 -1
  229. package/src/services/ai-docs/AGENTS.md +386 -0
  230. package/src/services/ai-docs/services-spec.md +497 -0
  231. package/src/services/config/Util.ts +13 -2
  232. package/src/services/config/ai-docs/AGENTS.md +255 -0
  233. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  234. package/src/services/config/ai-docs/config-spec.md +675 -0
  235. package/src/services/config/constants.ts +47 -7
  236. package/src/services/config/index.ts +45 -1
  237. package/src/services/config/types.ts +253 -11
  238. package/src/services/constants.ts +29 -0
  239. package/src/services/core/Err.ts +4 -0
  240. package/src/services/core/Utils.ts +143 -30
  241. package/src/services/core/WebexRequest.ts +3 -1
  242. package/src/services/core/ai-docs/AGENTS.md +381 -0
  243. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  244. package/src/services/core/ai-docs/core-spec.md +787 -0
  245. package/src/services/core/aqm-reqs.ts +125 -32
  246. package/src/services/core/types.ts +2 -0
  247. package/src/services/core/websocket/WebSocketManager.ts +23 -6
  248. package/src/services/core/websocket/connection-service.ts +5 -1
  249. package/src/services/core/websocket/types.ts +1 -1
  250. package/src/services/index.ts +4 -0
  251. package/src/services/task/Task.ts +908 -0
  252. package/src/services/task/TaskFactory.ts +60 -0
  253. package/src/services/task/TaskManager.ts +1291 -513
  254. package/src/services/task/TaskUtils.ts +314 -24
  255. package/src/services/task/WebexCallingUtils.ts +136 -0
  256. package/src/services/task/ai-docs/AGENTS.md +457 -0
  257. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  258. package/src/services/task/ai-docs/task-spec.md +1469 -0
  259. package/src/services/task/constants.ts +26 -0
  260. package/src/services/task/contact.ts +30 -0
  261. package/src/services/task/dialer.ts +136 -1
  262. package/src/services/task/digital/Digital.ts +97 -0
  263. package/src/services/task/state-machine/TaskStateMachine.ts +1313 -0
  264. package/src/services/task/state-machine/actions.ts +741 -0
  265. package/src/services/task/state-machine/ai-docs/AGENTS.md +462 -0
  266. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1146 -0
  267. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2209 -0
  268. package/src/services/task/state-machine/constants.ts +172 -0
  269. package/src/services/task/state-machine/guards.ts +498 -0
  270. package/src/services/task/state-machine/index.ts +28 -0
  271. package/src/services/task/state-machine/types.ts +258 -0
  272. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  273. package/src/services/task/taskDataNormalizer.ts +137 -0
  274. package/src/services/task/types.ts +843 -70
  275. package/src/services/task/voice/Voice.ts +1720 -0
  276. package/src/services/task/voice/WebRTC.ts +191 -0
  277. package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
  278. package/src/services/wxAppTelephonyUtils.ts +14 -0
  279. package/src/types.ts +238 -11
  280. package/src/utils/AGENTS.md +289 -0
  281. package/src/utils/PageCache.ts +38 -5
  282. package/src/utils/ai-docs/utils-spec.md +391 -0
  283. package/src/webex.js +2 -0
  284. package/test/unit/spec/cc.ts +1856 -122
  285. package/test/unit/spec/logger-proxy.ts +70 -0
  286. package/test/unit/spec/metrics/behavioral-events.ts +18 -0
  287. package/test/unit/spec/services/AddressBook.ts +37 -6
  288. package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
  289. package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
  290. package/test/unit/spec/services/EntryPoint.ts +87 -40
  291. package/test/unit/spec/services/Queue.ts +123 -12
  292. package/test/unit/spec/services/UserPreference.ts +401 -0
  293. package/test/unit/spec/services/WebCallingService.ts +7 -1
  294. package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
  295. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
  296. package/test/unit/spec/services/config/Util.ts +85 -0
  297. package/test/unit/spec/services/config/index.ts +85 -29
  298. package/test/unit/spec/services/core/Utils.ts +481 -2
  299. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  300. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  301. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
  302. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  303. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  304. package/test/unit/spec/services/task/Task.ts +677 -0
  305. package/test/unit/spec/services/task/TaskFactory.ts +99 -0
  306. package/test/unit/spec/services/task/TaskManager.ts +2209 -918
  307. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  308. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  309. package/test/unit/spec/services/task/contact.ts +33 -0
  310. package/test/unit/spec/services/task/dialer.ts +372 -96
  311. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  312. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +3433 -0
  313. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  314. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  315. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  316. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  317. package/test/unit/spec/services/task/voice/Voice.ts +1523 -0
  318. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  319. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -0
  320. package/umd/contact-center.min.js +2 -2
  321. package/umd/contact-center.min.js.map +1 -1
  322. package/dist/services/task/index.js +0 -1525
  323. package/dist/services/task/index.js.map +0 -1
  324. package/src/services/task/index.ts +0 -1801
  325. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,595 @@
1
+ # Task Service - Architecture
2
+
3
+ > **Legacy/reference-only.** Canonical SDD: [`task-spec.md`](task-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**: Technical documentation for task lifecycle management.
6
+
7
+ ---
8
+
9
+ ## Component Overview
10
+
11
+ | Component | File | Responsibility |
12
+ | -------------------- | ---------------------------- | ---------------------------------------------------------- |
13
+ | `TaskManager` | `task/TaskManager.ts` | Task lifecycle coordination |
14
+ | `Task` | `task/Task.ts` | Individual task operations |
15
+ | `contact` | `task/contact.ts` | AQM request definitions |
16
+ | `dialer` | `task/dialer.ts` | Outbound call initiation |
17
+ | `AutoWrapup` | `task/AutoWrapup.ts` | Auto wrapup timer |
18
+ | `taskDataNormalizer` | `task/taskDataNormalizer.ts` | Normalizes backend task payloads |
19
+ | `TaskUtils` | `task/TaskUtils.ts` | Utility functions |
20
+ | `state-machine` | `task/state-machine/*` | Task state transitions, guards, and UI control computation |
21
+
22
+ ---
23
+
24
+ ## Task Module Design Overview
25
+
26
+ ### `Task` (abstract)
27
+
28
+ **File:** `Task.ts`
29
+
30
+ **Properties**
31
+
32
+ - `data: TaskData`
33
+ - `webCallMap: Record<TaskId, CallId>`
34
+ - `stateMachineService?: ActorRefFrom<TaskStateMachine>`
35
+ - `state?: SnapshotFrom<TaskStateMachine>`
36
+ - `autoWrapup?: AutoWrapup`
37
+ - `uiControls: TaskUIControls` (getter)
38
+ - includes ordered, action-specific `consultTransferDestinations` computed from Task profile configuration and live interaction data
39
+
40
+ **Methods**
41
+
42
+ - `accept(): Promise<TaskResponse>` (abstract)
43
+ - `decline(): Promise<TaskResponse>` (default: unsupportedMethodError)
44
+ - `pauseRecording(): Promise<TaskResponse>` (default: unsupportedMethodError)
45
+ - `resumeRecording(resumeRecordingPayload: ResumeRecordingPayload): Promise<TaskResponse>` (default: unsupportedMethodError)
46
+ - `consult(consultPayload: ConsultPayload): Promise<TaskResponse>` (default: unsupportedMethodError)
47
+ - `endConsult(consultEndPayload?: ConsultEndPayload): Promise<TaskResponse>` (default: unsupportedMethodError)
48
+ - `consultTransfer(consultTransferPayload?: ConsultTransferPayLoad): Promise<TaskResponse>` (default: unsupportedMethodError)
49
+ - `consultConference(): Promise<TaskResponse>` (default: unsupportedMethodError)
50
+ - `exitConference(): Promise<TaskResponse>` (default: unsupportedMethodError)
51
+ - `transferConference(): Promise<TaskResponse>` (default: unsupportedMethodError)
52
+ - `switchCall(): Promise<TaskResponse>` (default: unsupportedMethodError)
53
+ - `toggleMute(): Promise<void>` (default: unsupportedMethodError)
54
+ - `unregisterWebCallListeners(): void` (default: no-op + log)
55
+ - `cancelAutoWrapupTimer(): void`
56
+ - `hold(mediaResourceId?: string): Promise<TaskResponse>` (default: unsupportedMethodError)
57
+ - `resume(mediaResourceId?: string): Promise<TaskResponse>` (default: unsupportedMethodError)
58
+ - `holdResume(): Promise<TaskResponse>` (default: unsupportedMethodError)
59
+ - `sendStateMachineEvent(event: TaskEventPayload): void`
60
+ - `updateTaskData(updatedData: TaskData, shouldOverwrite = false): ITask`
61
+ - `transfer(transferPayload: TransferPayLoad): Promise<TaskResponse>`
62
+ - `end(): Promise<TaskResponse>`
63
+ - `wrapup(wrapupPayload: WrapupPayLoad): Promise<TaskResponse>`
64
+
65
+ ### `Voice`
66
+
67
+ **File:** `voice/Voice.ts`
68
+
69
+ **Notes**
70
+
71
+ - Extends `Task`.
72
+ - Provides `hold()` and `resume()` that delegate to `holdResume()`.
73
+ - Explicitly overrides `accept()` and `decline()` to throw `unsupportedMethodError`.
74
+ - `WebRTC` then overrides these methods with concrete implementations.
75
+
76
+ ### `WebRTC`
77
+
78
+ **File:** `voice/WebRTC.ts`
79
+
80
+ **Notes**
81
+
82
+ - Extends `Voice`.
83
+ - Overrides `accept()` and `decline()` for WebRTC calls.
84
+ - Emits `TASK_EVENTS.TASK_MEDIA` on remote media (`CALL_EVENT_KEYS.REMOTE_MEDIA`).
85
+ - Overrides `unregisterWebCallListeners()`.
86
+
87
+ ### `Digital`
88
+
89
+ **File:** `digital/Digital.ts`
90
+
91
+ **Notes**
92
+
93
+ - Extends `Task`.
94
+ - Implements `accept()`.
95
+ - Overrides `updateTaskData()` to refresh digital task data and UI controls.
96
+
97
+ ### `TaskFactory`
98
+
99
+ **File:** `TaskFactory.ts`
100
+
101
+ **API**
102
+
103
+ - `createTask(contact, webCallingService, data, configFlags, wrapupData?, agentId?): Task`
104
+
105
+ **Behavior**
106
+
107
+ - Chooses `WebRTC` vs `Voice` for `MEDIA_CHANNEL.TELEPHONY` based on `webCallingService.loginOption`.
108
+ - Chooses `Digital` for `MEDIA_CHANNEL.CHAT`, `MEDIA_CHANNEL.EMAIL`, `MEDIA_CHANNEL.SOCIAL`.
109
+ - Throws `Error` for unknown media types.
110
+
111
+ ### Task Class Hierarchy Diagram
112
+
113
+ ```mermaid
114
+ classDiagram
115
+ class Task {
116
+ <<abstract>>
117
+ # contact
118
+ # metricsManager
119
+ + data: TaskData
120
+ + webCallMap: Record~TaskId, CallId~
121
+ + stateMachineService
122
+ + state
123
+ # currentUiControls: TaskUIControls
124
+ # uiControlConfig: UIControlConfig
125
+ + autoWrapup: AutoWrapup
126
+ + accept() TaskResponse
127
+ + transfer(payload) TaskResponse
128
+ + end() TaskResponse
129
+ + wrapup(payload) TaskResponse
130
+ + updateTaskData(updatedData, shouldOverwrite) ITask
131
+ + sendStateMachineEvent(event) void
132
+ + hold() TaskResponse
133
+ + resume() TaskResponse
134
+ + holdResume() TaskResponse
135
+ + consult(payload) TaskResponse
136
+ + endConsult(payload) TaskResponse
137
+ + consultTransfer(payload) TaskResponse
138
+ + consultConference() TaskResponse
139
+ + exitConference() TaskResponse
140
+ + transferConference() TaskResponse
141
+ + pauseRecording() TaskResponse
142
+ + resumeRecording(payload) TaskResponse
143
+ + toggleMute() void
144
+ + unregisterWebCallListeners() void
145
+ + cancelAutoWrapupTimer() void
146
+ }
147
+
148
+ class Voice {
149
+ + accept() TaskResponse
150
+ + decline() TaskResponse
151
+ + hold() TaskResponse
152
+ + resume() TaskResponse
153
+ + holdResume() TaskResponse
154
+ + pauseRecording() TaskResponse
155
+ + resumeRecording(payload) TaskResponse
156
+ + consult(payload) TaskResponse
157
+ + endConsult(payload) TaskResponse
158
+ + transfer(payload) TaskResponse
159
+ + consultConference() TaskResponse
160
+ + exitConference() TaskResponse
161
+ + transferConference() TaskResponse
162
+ }
163
+
164
+ class WebRTC {
165
+ - localAudioStream: LocalMicrophoneStream
166
+ - webCallingService: WebCallingService
167
+ + accept() TaskResponse
168
+ + decline() TaskResponse
169
+ + toggleMute() void
170
+ + unregisterWebCallListeners() void
171
+ }
172
+
173
+ class Digital {
174
+ + accept() TaskResponse
175
+ + updateTaskData(newData, shouldOverwrite) IDigital
176
+ }
177
+
178
+ class TaskFactory {
179
+ + createTask(contact, webCallingService, data, configFlags, wrapupData, agentId) Task
180
+ }
181
+
182
+ Task <|-- Voice
183
+ Voice <|-- WebRTC
184
+ Task <|-- Digital
185
+
186
+ TaskFactory ..> Task : creates
187
+ TaskFactory ..> Voice : creates
188
+ TaskFactory ..> WebRTC : creates
189
+ TaskFactory ..> Digital : creates
190
+ ```
191
+
192
+ ---
193
+
194
+ ## TaskManager Pattern
195
+
196
+ TaskManager is a singleton that:
197
+
198
+ 1. Listens for WebSocket task events
199
+ 2. Creates/manages Task objects
200
+ 3. Routes events to appropriate tasks
201
+ 4. Handles WebRTC call mapping
202
+
203
+ ```typescript
204
+ // Singleton access
205
+ const taskManager = TaskManager.getTaskManager(contact, webCallingService, webSocketManager);
206
+ ```
207
+
208
+ ---
209
+
210
+ ## AQM Request Modules
211
+
212
+ ### `routingContact(aqm: AqmReqs)` (`contact.ts`)
213
+
214
+ Returns an object of AQM request methods wired to `TASK_API` and `TASK_MESSAGE_TYPE`.
215
+
216
+ **Methods**
217
+
218
+ - `accept`
219
+ - `hold`
220
+ - `unHold`
221
+ - `pauseRecording`
222
+ - `resumeRecording`
223
+ - `consult`
224
+ - `consultEnd`
225
+ - `consultAccept`
226
+ - `blindTransfer`
227
+ - `vteamTransfer`
228
+ - `consultTransfer`
229
+ - `end`
230
+ - `wrapup`
231
+ - `cancelTask`
232
+ - `cancelCtq`
233
+ - `consultConference`
234
+ - `exitConference`
235
+ - `conferenceTransfer`
236
+
237
+ **Notes**
238
+
239
+ - Uses `WCC_API_GATEWAY`.
240
+ - Consult with `DESTINATION_TYPE.QUEUE` uses `TIMEOUT_REQ` = `'disabled'` for the request timeout.
241
+
242
+ ### `aqmDialer(aqm: AqmReqs)` (`dialer.ts`)
243
+
244
+ Returns an object of AQM request methods for outbound dialing.
245
+
246
+ **Methods**
247
+
248
+ - `startOutdial` (success: `CC_EVENTS.AGENT_OFFER_CONTACT`, failure: `CC_EVENTS.AGENT_OUTBOUND_FAILED`)
249
+
250
+ ---
251
+
252
+ ## Usage in Task Classes
253
+
254
+ ### `Task` (`Task.ts`)
255
+
256
+ - Constructor accepts `contact: ReturnType<typeof routingContact>`.
257
+ - Uses:
258
+ - `contact.vteamTransfer` / `contact.blindTransfer` in `transfer(...)`.
259
+ - While in consulting state, `transfer(...)` internally routes through consult-transfer behavior.
260
+ - `contact.end` in `end()`.
261
+ - `contact.wrapup` in `wrapup(...)`.
262
+
263
+ ### `Voice` (`voice/Voice.ts`)
264
+
265
+ Uses `contact` for:
266
+
267
+ - `hold`, `unHold`
268
+ - `pauseRecording`, `resumeRecording`
269
+ - `consult`, `consultEnd`, `consultTransfer`
270
+ - `consultConference`, `exitConference`, `conferenceTransfer`
271
+
272
+ ### `Digital` (`digital/Digital.ts`)
273
+
274
+ Uses `contact.accept` in `accept()`.
275
+
276
+ ---
277
+
278
+ ## State Machine Layer
279
+
280
+ `Task` delegates lifecycle transitions and control-state derivation to the state machine:
281
+
282
+ - Transition graph: `state-machine/TaskStateMachine.ts`
283
+ - Transition conditions: `state-machine/guards.ts`
284
+ - Context mutation and integration hooks: `state-machine/actions.ts`
285
+ - UI control derivation: `state-machine/uiControlsComputer.ts`
286
+
287
+ For state-machine-specific implementation guidance, use:
288
+
289
+ - `../state-machine/ai-docs/AGENTS.md`
290
+ - `../state-machine/ai-docs/ARCHITECTURE.md`
291
+
292
+ ### State Inventory (from `state-machine/constants.ts`)
293
+
294
+ - **Active lifecycle + intermediate states**:
295
+ - `IDLE`, `OFFERED`, `CONNECTED`
296
+ - `HOLD_INITIATING`, `HELD`, `RESUME_INITIATING`
297
+ - `CONSULT_INITIATING`, `CONSULTING`, `CONF_INITIATING`
298
+ - `CONFERENCING`, `WRAPPING_UP`, `COMPLETED`, `TERMINATED`
299
+ - **Future placeholders (defined, not currently implemented in transitions)**:
300
+ - `CONSULT_INITIATED`, `CONSULT_COMPLETED`, `POST_CALL`, `PARKED`, `MONITORING`
301
+
302
+ ---
303
+
304
+ ## Event Flow
305
+
306
+ ### Incoming Task Flow
307
+
308
+ ```mermaid
309
+ sequenceDiagram
310
+ participant BE as Backend
311
+ participant WS as WebSocket
312
+ participant TM as TaskManager
313
+ participant TF as TaskFactory
314
+ participant T as Task
315
+ participant CC as ContactCenter
316
+ participant App as Application
317
+
318
+ BE->>WS: AgentOfferContact event
319
+ WS->>TM: message event
320
+ TM->>TM: Check if telephony
321
+ alt BROWSER login
322
+ TM->>TM: Wait for INCOMING_CALL
323
+ WS->>TM: LINE_EVENTS.INCOMING_CALL
324
+ TM->>TM: Map call to task
325
+ end
326
+ TM->>TF: TaskFactory.createTask(...)
327
+ TF-->>TM: Voice/WebRTC/Digital Task instance
328
+ TM->>TM: Store in taskCollection
329
+ TM->>CC: emit task:incoming
330
+ CC->>App: trigger task:incoming
331
+ App->>T: task.accept()
332
+ ```
333
+
334
+ ### Task Operation Flow
335
+
336
+ ```mermaid
337
+ sequenceDiagram
338
+ participant App
339
+ participant T as Task
340
+ participant C as contact service
341
+ participant AQM as AqmReqs
342
+ participant WS as WebSocket
343
+ participant BE as Backend
344
+
345
+ App->>T: task.hold()
346
+ T->>T: Update local state
347
+ T->>C: contact.hold({data})
348
+ C->>AQM: req(config)
349
+ AQM->>BE: POST /v1/tasks/{interactionId}/hold (HTTP via WebexRequest)
350
+ BE-->>AQM: HTTP response (TaskResponse payload)
351
+ AQM-->>C: resolve Promise<TaskResponse>
352
+ C-->>T: return TaskResponse
353
+ T-->>App: Promise resolves
354
+ Note over WS,TM: WebSocket is notification channel, not request transport
355
+ BE-->>WS: AgentContactHeld
356
+ WS-->>TM: message event
357
+ TM-->>T: emit task:hold
358
+ ```
359
+
360
+ ---
361
+
362
+ ## Task Collection
363
+
364
+ TaskManager maintains a map of active tasks:
365
+
366
+ ```typescript
367
+ private taskCollection: Record<TaskId, ITask> = {};
368
+
369
+ // Tasks indexed by interactionId
370
+ this.taskCollection[interactionId] = task;
371
+
372
+ // Retrieve task
373
+ const task = this.taskCollection[interactionId];
374
+ ```
375
+
376
+ ---
377
+
378
+ ## WebSocket Event Handling
379
+
380
+ TaskManager uses a staged pipeline in `registerTaskListeners()`:
381
+
382
+ ```typescript
383
+ this.webSocketManager.on('message', (event) => {
384
+ // 1) Parse and validate message
385
+ const message = TaskManager.parseWebSocketMessage(event);
386
+ if (!message) return;
387
+
388
+ // 2) Build event context (task, payload, mapped state-machine event)
389
+ const eventContext = this.prepareEventContext(message);
390
+ if (!eventContext) return;
391
+
392
+ // 3) Handle lifecycle changes (create/update/remove task)
393
+ const actions = this.handleTaskLifecycleEvent(eventContext);
394
+ const {task} = actions;
395
+ if (!task) return;
396
+
397
+ // 4) Keep task.data synchronized
398
+ const {payload, stateMachineEvent} = eventContext;
399
+ if (payload) this.updateTaskData(task, payload);
400
+
401
+ // 5) Drive state machine (which emits TASK_EVENTS)
402
+ if (stateMachineEvent) {
403
+ task.sendStateMachineEvent(stateMachineEvent);
404
+ }
405
+ });
406
+ ```
407
+
408
+ ### RTD / AI Assistant event routing
409
+
410
+ `TaskManager.handleRealtimeWebsocketEvent()` handles payloads arriving on the realtime subscription socket used for AI features. It:
411
+
412
+ 1. Normalizes the websocket envelope (`payload.data` vs direct payload form)
413
+ 2. Resolves the owning task via `conversationId`
414
+ 3. Emits `REAL_TIME_TRANSCRIPTION` on the task for transcript payloads
415
+ 4. Emits `SUGGESTED_RESPONSE` on the task only when the backend payload is a final suggestion (`data.type === 'SUGGESTION'`)
416
+ 5. Ignores `SUGGESTED_RESPONSE_ACKNOWLEDGE` for public SDK emission
417
+
418
+ This keeps transcript and suggestion delivery aligned on the same per-task event surface.
419
+
420
+ ---
421
+
422
+ ## WebRTC Integration
423
+
424
+ For BROWSER login, TaskManager integrates with WebCalling:
425
+
426
+ ```mermaid
427
+ flowchart TD
428
+ A[AgentOfferContact event] --> B[Determine media + loginOption]
429
+ B --> C[TaskFactory chooses Voice/WebRTC class]
430
+ C --> D[Create Task object]
431
+ D --> E[Store in taskCollection]
432
+ E --> F{BROWSER login?}
433
+ F -->|Yes| G[Wait for INCOMING_CALL]
434
+ G --> H[Map call to task]
435
+ H --> I[Emit task:incoming]
436
+ F -->|No| I
437
+ ```
438
+
439
+ ### Call Mapping
440
+
441
+ ```typescript
442
+ // WebCallingService maps call IDs to interaction IDs
443
+ this.webCallingService.mapCallToTask(callId, interactionId);
444
+
445
+ // Task uses call for media operations
446
+ this.webCallingService.answerCall(localAudioStream: LocalMicrophoneStream, taskId: string);
447
+ ```
448
+
449
+ ---
450
+
451
+ ## Auto Wrapup
452
+
453
+ AutoWrapup handles automatic task completion:
454
+
455
+ ```typescript
456
+ // AutoWrapup.ts
457
+ export default class AutoWrapup {
458
+ private timer: ReturnType<typeof setTimeout> | null = null;
459
+ private readonly interval: number;
460
+
461
+ start(onComplete: () => void) {
462
+ this.timer = setTimeout(onComplete, this.interval);
463
+ }
464
+
465
+ clear() {
466
+ if (this.timer) {
467
+ clearTimeout(this.timer);
468
+ this.timer = null;
469
+ }
470
+ }
471
+
472
+ getTimeLeft() {}
473
+ isRunning() {}
474
+ getTimeLeftSeconds() {}
475
+ }
476
+ ```
477
+
478
+ ---
479
+
480
+ ## Contact Service Operations
481
+
482
+ Each task operation maps to an AQM request:
483
+
484
+ ```typescript
485
+ // contact.ts
486
+ export default function routingContact(routing: AqmReqs) {
487
+ return {
488
+ accept: routing.req((p) => ({
489
+ url: '/v1/tasks/.../accept',
490
+ notifSuccess: { bind: { type: CC_EVENTS.AGENT_CONTACT_ASSIGNED }},
491
+ notifFail: { bind: { type: CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED }},
492
+ })),
493
+
494
+ hold: routing.req((p) => ({...})),
495
+ unHold: routing.req((p) => ({...})),
496
+ consultAccept: routing.req((p) => ({...})),
497
+ cancelTask: routing.req((p) => ({...})),
498
+ cancelCtq: routing.req((p) => ({...})),
499
+ end: routing.req((p) => ({...})),
500
+ wrapup: routing.req((p) => ({...})),
501
+ blindTransfer: routing.req((p) => ({...})),
502
+ consult: routing.req((p) => ({...})),
503
+ consultTransfer: routing.req((p) => ({...})),
504
+ // ... more operations
505
+ };
506
+ }
507
+ ```
508
+
509
+ ---
510
+
511
+ ## Task Utils
512
+
513
+ Helper functions for task state analysis:
514
+
515
+ ```typescript
516
+ // TaskUtils.ts
517
+
518
+ // Check if participant is in main interaction
519
+ isParticipantInMainInteraction(task, agentId);
520
+
521
+ // Check if conference is in progress
522
+ getIsConferenceInProgress(taskData);
523
+
524
+ // Check if agent is primary
525
+ isPrimary(task, agentId);
526
+
527
+ // Check if secondary EPDN agent
528
+ isSecondaryEpDnAgent(interaction);
529
+ ```
530
+
531
+ ---
532
+
533
+ ## Metrics Tracking
534
+
535
+ | Metric | Type | When Tracked |
536
+ | ----------------------- | -------------------- | ------------------ |
537
+ | `TASK_ACCEPT_SUCCESS` | behavioral, business | Task accepted |
538
+ | `TASK_HOLD_SUCCESS` | operational | Hold succeeded |
539
+ | `TASK_END_SUCCESS` | behavioral, business | Task ended |
540
+ | `TASK_WRAPUP_SUCCESS` | operational | Wrapup completed |
541
+ | `TASK_TRANSFER_SUCCESS` | behavioral, business | Transfer completed |
542
+ | `TASK_OUTDIAL_SUCCESS` | behavioral, business | Outdial completed |
543
+
544
+ ---
545
+
546
+ ## Troubleshooting
547
+
548
+ ### Issue: task:incoming not received
549
+
550
+ **Cause**: Agent not available or TaskManager not initialized
551
+
552
+ **Solution**:
553
+
554
+ 1. Ensure `cc.register()` completed
555
+ 2. Ensure `cc.stationLogin()` completed
556
+ 3. Ensure agent state is Available
557
+
558
+ ### Issue: Task operations fail
559
+
560
+ **Cause**: Task state doesn't allow operation
561
+
562
+ **Solution**: Check task state before operation:
563
+
564
+ ```typescript
565
+ if (task.uiControls.main.hold.isEnabled) {
566
+ await task.hold();
567
+ }
568
+
569
+ // Consult-leg controls are exposed separately.
570
+ if (task.uiControls.consult.hold.isEnabled) {
571
+ // Render or enable the consult-leg hold action.
572
+ }
573
+ ```
574
+
575
+ ### Issue: WebRTC call not connecting
576
+
577
+ **Cause**: Call not mapped to task
578
+
579
+ **Solution**: Ensure BROWSER login and mercury connected:
580
+
581
+ ```typescript
582
+ await webex.internal.mercury.connect();
583
+ await cc.stationLogin({ loginOption: 'BROWSER', ... });
584
+ ```
585
+
586
+ ---
587
+
588
+ ## Related Files
589
+
590
+ - [cc.ts](../../../cc.ts) - Main plugin
591
+ - [TaskManager.ts](../TaskManager.ts) - Manager
592
+ - [contact.ts](../contact.ts) - Contact operations
593
+ - [types.ts](../types.ts) - Type definitions
594
+ - [../state-machine/ai-docs/AGENTS.md](../state-machine/ai-docs/AGENTS.md) - State machine guide
595
+ - [../state-machine/ai-docs/ARCHITECTURE.md](../state-machine/ai-docs/ARCHITECTURE.md) - State machine architecture