@webex/contact-center 3.12.0-next.16 → 3.12.0-next.161

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 (328) hide show
  1. package/.sdd/manifest.json +887 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +62 -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 +385 -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 +888 -49
  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 +38 -3
  46. package/dist/constants.js.map +1 -1
  47. package/dist/index.js +54 -17
  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 +185 -0
  52. package/dist/metrics/behavioral-events.js.map +1 -1
  53. package/dist/metrics/constants.js +54 -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 +369 -14
  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/WebCallingService.js +10 -2
  68. package/dist/services/WebCallingService.js.map +1 -1
  69. package/dist/services/WebexCrossClientService.js +225 -0
  70. package/dist/services/WebexCrossClientService.js.map +1 -0
  71. package/dist/services/WxAppTelephonyMercurySync.js +111 -0
  72. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  73. package/dist/services/config/Util.js +48 -48
  74. package/dist/services/config/Util.js.map +1 -1
  75. package/dist/services/config/constants.js +56 -78
  76. package/dist/services/config/constants.js.map +1 -1
  77. package/dist/services/config/index.js +100 -226
  78. package/dist/services/config/index.js.map +1 -1
  79. package/dist/services/config/types.js +93 -24
  80. package/dist/services/config/types.js.map +1 -1
  81. package/dist/services/constants.js +11 -1
  82. package/dist/services/constants.js.map +1 -1
  83. package/dist/services/core/Err.js.map +1 -1
  84. package/dist/services/core/Utils.js +131 -32
  85. package/dist/services/core/Utils.js.map +1 -1
  86. package/dist/services/core/WebexRequest.js +6 -2
  87. package/dist/services/core/WebexRequest.js.map +1 -1
  88. package/dist/services/core/aqm-reqs.js +17 -11
  89. package/dist/services/core/aqm-reqs.js.map +1 -1
  90. package/dist/services/core/constants.js +9 -1
  91. package/dist/services/core/constants.js.map +1 -1
  92. package/dist/services/core/types.js.map +1 -1
  93. package/dist/services/core/websocket/WebSocketManager.js +19 -2
  94. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  95. package/dist/services/core/websocket/types.js.map +1 -1
  96. package/dist/services/index.js +1 -1
  97. package/dist/services/index.js.map +1 -1
  98. package/dist/services/task/Task.js +955 -0
  99. package/dist/services/task/Task.js.map +1 -0
  100. package/dist/services/task/TaskFactory.js +50 -0
  101. package/dist/services/task/TaskFactory.js.map +1 -0
  102. package/dist/services/task/TaskManager.js +1272 -605
  103. package/dist/services/task/TaskManager.js.map +1 -1
  104. package/dist/services/task/TaskUtils.js +221 -27
  105. package/dist/services/task/TaskUtils.js.map +1 -1
  106. package/dist/services/task/WebexCallingUtils.js +70 -0
  107. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  108. package/dist/services/task/constants.js +19 -2
  109. package/dist/services/task/constants.js.map +1 -1
  110. package/dist/services/task/contact.js +29 -0
  111. package/dist/services/task/contact.js.map +1 -1
  112. package/dist/services/task/digital/Digital.js +78 -0
  113. package/dist/services/task/digital/Digital.js.map +1 -0
  114. package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
  115. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  116. package/dist/services/task/state-machine/actions.js +572 -0
  117. package/dist/services/task/state-machine/actions.js.map +1 -0
  118. package/dist/services/task/state-machine/constants.js +161 -0
  119. package/dist/services/task/state-machine/constants.js.map +1 -0
  120. package/dist/services/task/state-machine/guards.js +379 -0
  121. package/dist/services/task/state-machine/guards.js.map +1 -0
  122. package/dist/services/task/state-machine/index.js +53 -0
  123. package/dist/services/task/state-machine/index.js.map +1 -0
  124. package/dist/services/task/state-machine/types.js +54 -0
  125. package/dist/services/task/state-machine/types.js.map +1 -0
  126. package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
  127. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  128. package/dist/services/task/taskDataNormalizer.js +99 -0
  129. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  130. package/dist/services/task/types.js +215 -5
  131. package/dist/services/task/types.js.map +1 -1
  132. package/dist/services/task/voice/Voice.js +1504 -0
  133. package/dist/services/task/voice/Voice.js.map +1 -0
  134. package/dist/services/task/voice/WebRTC.js +152 -0
  135. package/dist/services/task/voice/WebRTC.js.map +1 -0
  136. package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
  137. package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
  138. package/dist/services/task/voice/wxAppVoiceMethods.js +395 -0
  139. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  140. package/dist/services/wxAppDiagnosticLogging.js +159 -0
  141. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  142. package/dist/services/wxAppTelephonyUtils.js +19 -0
  143. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  144. package/dist/types/cc.d.ts +152 -9
  145. package/dist/types/config.d.ts +13 -0
  146. package/dist/types/constants.d.ts +36 -1
  147. package/dist/types/index.d.ts +54 -20
  148. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  149. package/dist/types/metrics/constants.d.ts +48 -1
  150. package/dist/types/services/AddressBook.d.ts +2 -1
  151. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  152. package/dist/types/services/ApiAiAssistant.d.ts +67 -5
  153. package/dist/types/services/EntryPoint.d.ts +7 -5
  154. package/dist/types/services/Queue.d.ts +5 -3
  155. package/dist/types/services/UserPreference.d.ts +118 -0
  156. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  157. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  158. package/dist/types/services/config/Util.d.ts +4 -8
  159. package/dist/types/services/config/constants.d.ts +49 -76
  160. package/dist/types/services/config/index.d.ts +16 -64
  161. package/dist/types/services/config/types.d.ts +240 -114
  162. package/dist/types/services/constants.d.ts +9 -0
  163. package/dist/types/services/core/Err.d.ts +2 -0
  164. package/dist/types/services/core/Utils.d.ts +43 -13
  165. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  166. package/dist/types/services/core/constants.d.ts +7 -0
  167. package/dist/types/services/core/types.d.ts +2 -0
  168. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  169. package/dist/types/services/core/websocket/types.d.ts +1 -1
  170. package/dist/types/services/index.d.ts +1 -1
  171. package/dist/types/services/task/Task.d.ts +186 -0
  172. package/dist/types/services/task/TaskFactory.d.ts +14 -0
  173. package/dist/types/services/task/TaskUtils.d.ts +54 -2
  174. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  175. package/dist/types/services/task/constants.d.ts +17 -0
  176. package/dist/types/services/task/contact.d.ts +4 -0
  177. package/dist/types/services/task/digital/Digital.d.ts +23 -0
  178. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
  179. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  180. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  181. package/dist/types/services/task/state-machine/guards.d.ts +103 -0
  182. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  183. package/dist/types/services/task/state-machine/types.d.ts +277 -0
  184. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  185. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  186. package/dist/types/services/task/types.d.ts +738 -66
  187. package/dist/types/services/task/voice/Voice.d.ts +241 -0
  188. package/dist/types/services/task/voice/WebRTC.d.ts +54 -0
  189. package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
  190. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +68 -0
  191. package/dist/types/services/wxAppDiagnosticLogging.d.ts +63 -0
  192. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  193. package/dist/types/types.d.ts +213 -11
  194. package/dist/types/utils/PageCache.d.ts +20 -3
  195. package/dist/types/webex.d.ts +1 -0
  196. package/dist/types.js +168 -6
  197. package/dist/types.js.map +1 -1
  198. package/dist/utils/PageCache.js +19 -5
  199. package/dist/utils/PageCache.js.map +1 -1
  200. package/dist/webex.js +22 -2
  201. package/dist/webex.js.map +1 -1
  202. package/package.json +16 -12
  203. package/src/cc.ts +1137 -67
  204. package/src/config.ts +13 -0
  205. package/src/constants.ts +39 -1
  206. package/src/index.ts +62 -15
  207. package/src/metrics/MetricsManager.ts +16 -0
  208. package/src/metrics/ai-docs/AGENTS.md +350 -0
  209. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  210. package/src/metrics/ai-docs/metrics-spec.md +971 -0
  211. package/src/metrics/behavioral-events.ts +190 -0
  212. package/src/metrics/constants.ts +59 -4
  213. package/src/services/AddressBook.ts +17 -6
  214. package/src/services/AnswerCallOnWebexService.ts +239 -0
  215. package/src/services/ApiAiAssistant.ts +494 -15
  216. package/src/services/EntryPoint.ts +59 -60
  217. package/src/services/Queue.ts +29 -12
  218. package/src/services/UserPreference.ts +509 -0
  219. package/src/services/WebCallingService.ts +16 -2
  220. package/src/services/WebexCrossClientService.ts +298 -0
  221. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  222. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  223. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  224. package/src/services/agent/ai-docs/agent-spec.md +505 -0
  225. package/src/services/ai-docs/AGENTS.md +386 -0
  226. package/src/services/ai-docs/services-spec.md +512 -0
  227. package/src/services/config/Util.ts +54 -84
  228. package/src/services/config/ai-docs/AGENTS.md +250 -0
  229. package/src/services/config/ai-docs/ARCHITECTURE.md +413 -0
  230. package/src/services/config/ai-docs/config-spec.md +669 -0
  231. package/src/services/config/constants.ts +63 -85
  232. package/src/services/config/index.ts +116 -277
  233. package/src/services/config/types.ts +229 -125
  234. package/src/services/constants.ts +10 -0
  235. package/src/services/core/Err.ts +1 -0
  236. package/src/services/core/Utils.ts +151 -37
  237. package/src/services/core/WebexRequest.ts +3 -1
  238. package/src/services/core/ai-docs/AGENTS.md +381 -0
  239. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  240. package/src/services/core/ai-docs/core-spec.md +797 -0
  241. package/src/services/core/aqm-reqs.ts +18 -12
  242. package/src/services/core/constants.ts +8 -0
  243. package/src/services/core/types.ts +33 -1
  244. package/src/services/core/websocket/WebSocketManager.ts +28 -2
  245. package/src/services/core/websocket/types.ts +1 -1
  246. package/src/services/index.ts +1 -1
  247. package/src/services/task/Task.ts +1211 -0
  248. package/src/services/task/TaskFactory.ts +82 -0
  249. package/src/services/task/TaskManager.ts +1585 -724
  250. package/src/services/task/TaskUtils.ts +316 -25
  251. package/src/services/task/WebexCallingUtils.ts +136 -0
  252. package/src/services/task/ai-docs/AGENTS.md +457 -0
  253. package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
  254. package/src/services/task/ai-docs/task-spec.md +1501 -0
  255. package/src/services/task/constants.ts +18 -0
  256. package/src/services/task/contact.ts +30 -0
  257. package/src/services/task/digital/Digital.ts +102 -0
  258. package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
  259. package/src/services/task/state-machine/actions.ts +741 -0
  260. package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
  261. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
  262. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
  263. package/src/services/task/state-machine/constants.ts +172 -0
  264. package/src/services/task/state-machine/guards.ts +442 -0
  265. package/src/services/task/state-machine/index.ts +28 -0
  266. package/src/services/task/state-machine/types.ts +258 -0
  267. package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
  268. package/src/services/task/taskDataNormalizer.ts +137 -0
  269. package/src/services/task/types.ts +918 -70
  270. package/src/services/task/voice/Voice.ts +1878 -0
  271. package/src/services/task/voice/WebRTC.ts +194 -0
  272. package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
  273. package/src/services/task/voice/wxAppVoiceMethods.ts +575 -0
  274. package/src/services/wxAppDiagnosticLogging.ts +286 -0
  275. package/src/services/wxAppTelephonyUtils.ts +14 -0
  276. package/src/types.ts +272 -13
  277. package/src/utils/AGENTS.md +289 -0
  278. package/src/utils/PageCache.ts +38 -5
  279. package/src/utils/ai-docs/utils-spec.md +391 -0
  280. package/src/webex.js +10 -0
  281. package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
  282. package/test/unit/spec/cc.ts +3553 -107
  283. package/test/unit/spec/index.ts +885 -0
  284. package/test/unit/spec/logger-proxy.ts +70 -0
  285. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  286. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  287. package/test/unit/spec/services/AddressBook.ts +37 -6
  288. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  289. package/test/unit/spec/services/ApiAiAssistant.ts +442 -23
  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 +45 -1
  294. package/test/unit/spec/services/WebexCrossClientService.ts +509 -0
  295. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  296. package/test/unit/spec/services/config/Util.ts +501 -0
  297. package/test/unit/spec/services/config/index.ts +317 -547
  298. package/test/unit/spec/services/core/Utils.ts +447 -8
  299. package/test/unit/spec/services/core/WebexRequest.ts +8 -7
  300. package/test/unit/spec/services/core/aqm-reqs.ts +142 -1
  301. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +129 -53
  302. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  303. package/test/unit/spec/services/task/Task.ts +2723 -0
  304. package/test/unit/spec/services/task/TaskFactory.ts +116 -0
  305. package/test/unit/spec/services/task/TaskManager.ts +4734 -1769
  306. package/test/unit/spec/services/task/TaskUtils.ts +307 -0
  307. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  308. package/test/unit/spec/services/task/contact.ts +33 -0
  309. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  310. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
  311. package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
  312. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  313. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
  314. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  315. package/test/unit/spec/services/task/voice/Voice.ts +2355 -0
  316. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  317. package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
  318. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +719 -0
  319. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +179 -0
  320. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  321. package/typedoc.md +1 -1
  322. package/umd/contact-center.min.js +2 -2
  323. package/umd/contact-center.min.js.map +1 -1
  324. package/dist/services/task/index.js +0 -1530
  325. package/dist/services/task/index.js.map +0 -1
  326. package/dist/types/services/task/index.d.ts +0 -650
  327. package/src/services/task/index.ts +0 -1806
  328. package/test/unit/spec/services/task/index.ts +0 -2205
@@ -0,0 +1,241 @@
1
+ import routingContact from '../contact';
2
+ import { ConsultPayload, ConsultEndPayload, ResumeRecordingPayload, TaskData, TaskResponse, DropConferenceParticipantPayload, IVoice, VoiceUIControlOptions, TaskToggleMuteOptions, TaskTransmitDtmfOptions, TransferPayLoad } from '../types';
3
+ import Task from '../Task';
4
+ import { TaskActionArgs } from '../state-machine';
5
+ import type { WrapupData } from '../../config/types';
6
+ import type ApiAIAssistant from '../../ApiAiAssistant';
7
+ export default class Voice extends Task implements IVoice {
8
+ private static readonly WXAPP_MUTE_SYNC_RETRY_DELAY_MS;
9
+ private static readonly WXAPP_MUTE_SYNC_MAX_RETRIES;
10
+ private answerCallOnWebexService?;
11
+ private enableWxBetterTogether;
12
+ private wxAppMuted;
13
+ private wxAppAnswerPending;
14
+ private wxAppAcceptInFlight;
15
+ private wxAppMuteSyncInFlight?;
16
+ private wxAppMuteToggleTail;
17
+ private wxAppDtmfTail;
18
+ /** Lazy — `super()` may call `updateUiControls` before field initializers run. */
19
+ private wxAppOfferObservability;
20
+ private getUsersubPublished?;
21
+ constructor(contact: ReturnType<typeof routingContact>, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string, agentName?: string, apiAIAssistant?: ApiAIAssistant);
22
+ private getWxAppVoiceDependencies;
23
+ /** @deprecated Use {@link Voice.getWxAppVoiceDependencies} */
24
+ private getWxAppVoiceDeps;
25
+ isWebexAppCallingOffer(): boolean;
26
+ isWebexAppInboundCallingOffer(): boolean;
27
+ private setWxAppAnswerPending;
28
+ private setWxAppAcceptInFlight;
29
+ setEnableWxBetterTogether(enabled: boolean): void;
30
+ private getOrCreateWxAppOfferObservability;
31
+ protected updateUiControls(forceEmit?: boolean): void;
32
+ /**
33
+ * Re-run OFFERED wxApp diagnostics without emitting UI controls.
34
+ * Used after usersub publish so a pre-publish offer can schedule mismatch grace.
35
+ */
36
+ refreshWxAppOfferObservability(): void;
37
+ /**
38
+ * Cancel pending participant-mismatch grace timer. Observability only.
39
+ */
40
+ disposeWxAppOfferObservability(): void;
41
+ private getWxAppOfferObservabilityContext;
42
+ applyWxAppMuteStateFromSync(incomingCallId: string, muted: boolean): void;
43
+ getWxAppMuted(): boolean;
44
+ private static delay;
45
+ private canRetryWxAppMuteSync;
46
+ private shouldSkipWxAppMuteSync;
47
+ private applyWxAppMuteFromBackfill;
48
+ syncWxAppMuteFromCallDetails(retryAttempt?: number): Promise<boolean | undefined>;
49
+ private performWxAppMuteSync;
50
+ protected onTaskAssigned(): void;
51
+ protected onTaskHydrated(): void;
52
+ getCallingDeviceDetails(): import("../WebexCallingUtils").WebexCallingDeviceDetails;
53
+ getWebexCallingCallId(): string | null;
54
+ private createWxAppLifecycle;
55
+ private getStateMachineSnapshot;
56
+ private getWxAppAcceptReasonForMetrics;
57
+ /**
58
+ * Accepts the task. Routes to wxApp telephony answer when `enableWxBetterTogether` and wxApp offer.
59
+ */
60
+ accept(): Promise<TaskResponse>;
61
+ /**
62
+ * Declines the task. Routes wxApp inbound to telephony reject; wxApp outdial offer to cancelTask.
63
+ */
64
+ decline(): Promise<TaskResponse>;
65
+ /**
66
+ * Toggles mute for wxApp engaged telephony when `enableWxBetterTogether` is active.
67
+ */
68
+ toggleMute(options?: TaskToggleMuteOptions): Promise<void>;
69
+ /**
70
+ * Sends in-call DTMF for wxApp engaged telephony when `enableWxBetterTogether` is active.
71
+ */
72
+ transmitDtmf(options: TaskTransmitDtmfOptions): Promise<void>;
73
+ /**
74
+ * This is used to hold the task.
75
+ * @returns Promise<TaskResponse>
76
+ * @throws Error
77
+ * @example
78
+ * ```typescript
79
+ * task.hold().then(()=>{}).catch(()=>{})
80
+ * ```
81
+ * */
82
+ hold(): Promise<TaskResponse>;
83
+ /**
84
+ * This is used to resume the task.
85
+ * @returns Promise<TaskResponse>
86
+ * @throws Error
87
+ * @example
88
+ * ```typescript
89
+ * task.resume().then(()=>{}).catch(()=>{})
90
+ * ```
91
+ * */
92
+ resume(): Promise<TaskResponse>;
93
+ /**
94
+ * This is used to hold or resume the task.
95
+ * @param isHeld: boolean - true to hold the task, false to resume it
96
+ * @returns Promise<TaskResponse>
97
+ * @throws Error
98
+ * @example
99
+ * ```typescript
100
+ * task.holdResume(isHeld: true).then(()=>{}).catch(()=>{})
101
+ * ```
102
+ * */
103
+ holdResume(): Promise<TaskResponse>;
104
+ /**
105
+ * This is used to pause the call recording
106
+ * @returns Promise<TaskResponse>
107
+ * @throws Error
108
+ * @example
109
+ * ```typescript
110
+ * task.pauseRecording().then(()=>{}).catch(()=>{});
111
+ * ```
112
+ */
113
+ pauseRecording(): Promise<TaskResponse>;
114
+ /**
115
+ * This is used to pause the call recording
116
+ * @param resumeRecordingPayload
117
+ * @returns Promise<TaskResponse>
118
+ * @throws Error
119
+ * @example
120
+ * ```typescript
121
+ * task.resumeRecording(resumeRecordingPayload).then(()=>{}).catch(()=>{});
122
+ * ```
123
+ */
124
+ resumeRecording(resumeRecordingPayload?: ResumeRecordingPayload): Promise<TaskResponse>;
125
+ /**
126
+ * This is used to consult the task
127
+ * @param consultPayload
128
+ * @returns Promise<TaskResponse>
129
+ * @throws Error
130
+ * @example
131
+ * ```typescript
132
+ * const consultPayload = {
133
+ * destination: 'myBuddyAgentId',
134
+ * destinationType: DESTINATION_TYPE.AGENT,
135
+ * }
136
+ * task.consult(consultPayload).then(()=>{}).catch(()=>{});
137
+ * ```
138
+ * */
139
+ consult(consultPayload?: ConsultPayload): Promise<TaskResponse>;
140
+ /**
141
+ * This is used to end the consult session on the task.
142
+ * @param consultEndPayload - Payload indicating consult end flags and identifiers
143
+ * @returns Promise<TaskResponse>
144
+ * @throws Error
145
+ * @example
146
+ * ```typescript
147
+ * task.endConsult({
148
+ * isConsult: true,
149
+ * queueId: 'myQueueId',
150
+ * taskId: 'taskId',
151
+ * });
152
+ * ```
153
+ */
154
+ endConsult(consultEndPayload?: ConsultEndPayload): Promise<TaskResponse>;
155
+ /**
156
+ * This is used to transfer the task.
157
+ * @param payload - Transfer payload
158
+ * @returns Promise<TaskResponse>
159
+ * @throws Error
160
+ * @example
161
+ * ```typescript
162
+ * task.transfer({
163
+ * to: 'destinationId',
164
+ * destinationType: DESTINATION_TYPE.AGENT,
165
+ * consult: true, // Optional, if true will perform a consult transfer else blind transfer
166
+ * });
167
+ * ```
168
+ */
169
+ transfer(payload: TransferPayLoad): Promise<TaskResponse>;
170
+ /**
171
+ * Start a consult conference, merging main and consult calls.
172
+ */
173
+ consultConference(): Promise<TaskResponse>;
174
+ /**
175
+ * Removes another participant from an active conference.
176
+ * Completion is correlated with ParticipantLeftConference by the AQM request layer.
177
+ * @param payload - Participant identifier to remove
178
+ * @returns Promise<TaskResponse>
179
+ */
180
+ dropConferenceParticipant(payload: DropConferenceParticipantPayload): Promise<TaskResponse>;
181
+ /**
182
+ * Exit from a conference call.
183
+ * Per conference-spec.md:
184
+ * - Primary agent exits to wrapup
185
+ * - Non-primary agent exits to available/connected
186
+ * - Other participants continue the call
187
+ *
188
+ * @returns Promise<TaskResponse>
189
+ * @throws Error if not in conference or exit fails
190
+ * @example
191
+ * ```typescript
192
+ * task.exitConference().then(() => {}).catch(() => {});
193
+ * ```
194
+ */
195
+ exitConference(): Promise<TaskResponse>;
196
+ /**
197
+ * Transfer the conference to another participant.
198
+ * Per conference-spec.md: Only primary agent can transfer conference.
199
+ * After transfer, the transferring agent exits to wrapup.
200
+ *
201
+ * @returns Promise<TaskResponse>
202
+ * @throws Error if not in conference or transfer fails
203
+ * @example
204
+ * ```typescript
205
+ * task.transferConference().then(() => {}).catch(() => {});
206
+ * ```
207
+ */
208
+ transferConference(): Promise<TaskResponse>;
209
+ /**
210
+ * Toggle between consult call and main call during consulting.
211
+ * If on consult leg (consultCallHeld = false), switches to main call by holding consult.
212
+ * If on main call (consultCallHeld = true), switches to consult by resuming consult.
213
+ *
214
+ * @returns Promise<TaskResponse>
215
+ * @throws Error if not in CONSULTING state or no consult media resource
216
+ * @example
217
+ * ```typescript
218
+ * await task.switchCall();
219
+ * ```
220
+ */
221
+ switchCall(): Promise<TaskResponse>;
222
+ protected getChannelSpecificActionOverrides(): {
223
+ emitTaskHold: ({ event }: TaskActionArgs) => void;
224
+ emitTaskResume: ({ event }: TaskActionArgs) => void;
225
+ emitTaskRecordingStarted: ({ event }: TaskActionArgs) => void;
226
+ emitTaskRecordingPaused: ({ event }: TaskActionArgs) => void;
227
+ emitTaskRecordingPauseFailed: ({ event }: TaskActionArgs) => void;
228
+ emitTaskRecordingResumed: ({ event }: TaskActionArgs) => void;
229
+ emitTaskRecordingResumeFailed: ({ event }: TaskActionArgs) => void;
230
+ emitTaskParticipantJoined: ({ event }: TaskActionArgs) => void;
231
+ emitTaskParticipantLeft: ({ event }: TaskActionArgs) => void;
232
+ emitTaskConferenceStarted: ({ event }: TaskActionArgs) => void;
233
+ emitTaskConferenceEnded: ({ event }: TaskActionArgs) => void;
234
+ emitTaskConferenceFailed: ({ event }: TaskActionArgs) => void;
235
+ emitTaskExitConference: ({ event }: TaskActionArgs) => void;
236
+ emitTaskTransferConference: ({ event }: TaskActionArgs) => void;
237
+ emitTaskSwitchCall: ({ event }: TaskActionArgs) => void;
238
+ emitTaskTransferConferenceFailed: ({ event }: TaskActionArgs) => void;
239
+ emitTaskOutdialFailed: ({ event }: TaskActionArgs) => void;
240
+ };
241
+ }
@@ -0,0 +1,54 @@
1
+ import routingContact from '../contact';
2
+ import { TaskData, TaskResponse, IWebRTC, VoiceUIControlOptions, TaskToggleMuteOptions } from '../types';
3
+ import Voice from './Voice';
4
+ import WebCallingService from '../../WebCallingService';
5
+ import type { WrapupData } from '../../config/types';
6
+ import type ApiAIAssistant from '../../ApiAiAssistant';
7
+ export default class WebRTC extends Voice implements IWebRTC {
8
+ private localAudioStream;
9
+ private webCallingService;
10
+ constructor(contact: ReturnType<typeof routingContact>, webCallingService: WebCallingService, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string, agentName?: string, apiAIAssistant?: ApiAIAssistant);
11
+ private registerWebCallListeners;
12
+ private handleRemoteMedia;
13
+ /**
14
+ * This method is used to unregister the web call listeners.
15
+ * @returns void
16
+ * @example
17
+ * ```typescript
18
+ * task.unregisterWebCallListeners();
19
+ * ```
20
+ */
21
+ unregisterWebCallListeners(): void;
22
+ /**
23
+ * This is used for incoming task accept by agent.
24
+ *
25
+ * @returns Promise<TaskResponse>
26
+ * @throws Error
27
+ * @example
28
+ * ```typescript
29
+ * task.accept().then(()=>{}).catch(()=>{})
30
+ * ```
31
+ */
32
+ accept(): Promise<TaskResponse>;
33
+ /**
34
+ * This is used for the incoming task decline by agent.
35
+ *
36
+ * @returns Promise<TaskResponse>
37
+ * @throws Error
38
+ * @example
39
+ * ```typescript
40
+ * task.decline().then(()=>{}).catch(()=>{})
41
+ * ```
42
+ */
43
+ decline(): Promise<TaskResponse>;
44
+ /**
45
+ * This is used for the placing the call in mute or unmute by the agent.
46
+ *
47
+ * @throws Error
48
+ * @example
49
+ * ```typescript
50
+ * task.toggleMute().then(()=>{}).catch(()=>{})
51
+ * ```
52
+ */
53
+ toggleMute(options?: TaskToggleMuteOptions): Promise<void>;
54
+ }
@@ -0,0 +1,39 @@
1
+ import MetricsManager from '../../../metrics/MetricsManager';
2
+ import { TaskState } from '../state-machine';
3
+ import { VoiceVariant } from '../types';
4
+ import { WxAppVoiceDependencies } from './wxAppVoiceMethods';
5
+ /** Defer mismatch WARN/metric so transient WS ordering gaps (~200–300 ms) do not false-alarm. */
6
+ export declare const WXAPP_PARTICIPANT_MISMATCH_GRACE_MS = 500;
7
+ export type WxAppOfferObservabilityContext = {
8
+ getInteractionId: () => string;
9
+ getTaskState: () => TaskState | undefined;
10
+ getAcceptControl: () => {
11
+ isVisible: boolean;
12
+ isEnabled: boolean;
13
+ } | undefined;
14
+ getVoiceVariant: () => VoiceVariant;
15
+ isOutdial: () => boolean;
16
+ isWxAppInboundOffer: () => boolean;
17
+ isWxAppCallingOffer: () => boolean;
18
+ getWxAppAcceptInFlight: () => boolean;
19
+ getWxAppAnswerPending: () => boolean;
20
+ getEnableWxBetterTogether: () => boolean;
21
+ getUsersubPublished: () => boolean;
22
+ getWxAppVoiceDependencies: () => WxAppVoiceDependencies;
23
+ getMetricsManager: () => MetricsManager;
24
+ };
25
+ /**
26
+ * OFFERED-state wxApp offer diagnostics: acceptReason logging and deferred participant mismatch.
27
+ * Invoked from Voice.updateUiControls — observability only.
28
+ */
29
+ export declare class WxAppOfferObservability {
30
+ private lastLoggedWxAppAcceptReason?;
31
+ private lastLoggedWxAppParticipantMismatch;
32
+ private wxAppParticipantMismatchGraceTimer?;
33
+ private disposed;
34
+ handleUiControlsUpdate(ctx: WxAppOfferObservabilityContext): void;
35
+ dispose(): void;
36
+ private cancelGraceTimer;
37
+ private scheduleGraceTimer;
38
+ private emitParticipantMismatchIfStillNeeded;
39
+ }
@@ -0,0 +1,68 @@
1
+ import AnswerCallOnWebexService from '../../AnswerCallOnWebexService';
2
+ import { TaskData, TaskToggleMuteOptions, TaskTransmitDtmfOptions } from '../types';
3
+ import { TaskState } from '../state-machine';
4
+ import MetricsManager from '../../../metrics/MetricsManager';
5
+ import { WebexCallingDeviceDetails } from '../WebexCallingUtils';
6
+ import { type WxAppAcceptReason } from '../../wxAppDiagnosticLogging';
7
+ export type WxAppVoiceDependencies = {
8
+ enableWxBetterTogether: boolean;
9
+ answerCallOnWebexService?: AnswerCallOnWebexService;
10
+ agentId?: string;
11
+ metricsManager: MetricsManager;
12
+ getTaskData: () => TaskData;
13
+ getTaskState: () => TaskState | undefined;
14
+ getWxAppMuted: () => boolean;
15
+ setWxAppMuted: (muted: boolean) => void;
16
+ /** Read-only observability: whether usersub answer-calls-on-wxcc is active this session. */
17
+ getUsersubPublished?: () => boolean;
18
+ };
19
+ export type WxAppParticipantDiagnostics = {
20
+ participantDeviceType?: string;
21
+ hasDeviceCallId: boolean;
22
+ hasDeviceId: boolean;
23
+ hasValidWxAppParticipant: boolean;
24
+ };
25
+ /** @deprecated Use {@link WxAppVoiceDependencies} */
26
+ export type WxAppVoiceDeps = WxAppVoiceDependencies;
27
+ export type WxAppVoiceLifecycle = {
28
+ setWxAppAcceptInFlight: (inFlight: boolean) => void;
29
+ setWxAppAnswerPending: (pending: boolean) => void;
30
+ resetWxAppMuted: () => void;
31
+ syncWxAppMuteFromCallDetails: () => Promise<boolean | undefined>;
32
+ mapWxAppVoiceError: (error: unknown, method: string) => never;
33
+ };
34
+ export declare function getWxAppParticipantDiagnostics(deps: WxAppVoiceDependencies): WxAppParticipantDiagnostics;
35
+ export declare function getCallingDeviceDetails(deps: WxAppVoiceDependencies): WebexCallingDeviceDetails | undefined;
36
+ export declare function isWebexAppCallingOffer(deps: WxAppVoiceDependencies): boolean;
37
+ /** Inbound wxApp offer only — outdial decline uses CC routing, not telephony reject. */
38
+ export declare function isWebexAppInboundCallingOffer(deps: WxAppVoiceDependencies): boolean;
39
+ export declare function getWebexCallingCallId(deps: WxAppVoiceDependencies): string | null;
40
+ export declare function getWxAppLineOwnerId(deps: WxAppVoiceDependencies): string | undefined;
41
+ export declare function resolveWxAppLineOwnerId(deps: WxAppVoiceDependencies, override?: string): string | undefined;
42
+ export declare function acceptOnWebex(deps: WxAppVoiceDependencies, options?: {
43
+ lineOwnerId?: string;
44
+ }): Promise<void>;
45
+ export declare function rejectOnWebex(deps: WxAppVoiceDependencies, options?: {
46
+ lineOwnerId?: string;
47
+ }): Promise<void>;
48
+ export declare function toggleMuteOnWebex(deps: WxAppVoiceDependencies, options?: {
49
+ lineOwnerId?: string;
50
+ muted?: boolean;
51
+ }): Promise<void>;
52
+ export declare function transmitDtmfOnWebex(deps: WxAppVoiceDependencies, options: {
53
+ dtmf: string;
54
+ lineOwnerId?: string;
55
+ }): Promise<void>;
56
+ export type WxAppAcceptRejectOptions = {
57
+ lineOwnerId?: string;
58
+ acceptReason?: WxAppAcceptReason;
59
+ };
60
+ export declare function runWxAppAccept(deps: WxAppVoiceDependencies, lifecycle: WxAppVoiceLifecycle, options?: WxAppAcceptRejectOptions): Promise<void>;
61
+ export declare function runWxAppReject(deps: WxAppVoiceDependencies, lifecycle: WxAppVoiceLifecycle, options?: WxAppAcceptRejectOptions): Promise<void>;
62
+ export type WxAppOutdialDeclineOptions = {
63
+ acceptReason?: WxAppAcceptReason;
64
+ };
65
+ export declare function runWxAppOutdialDecline<T>(deps: WxAppVoiceDependencies, executeCancel: () => Promise<T>, options?: WxAppOutdialDeclineOptions): Promise<T>;
66
+ export declare function runWxAppToggleMute(deps: WxAppVoiceDependencies, lifecycle: WxAppVoiceLifecycle, options?: TaskToggleMuteOptions): Promise<void>;
67
+ export declare function runWxAppTransmitDtmf(deps: WxAppVoiceDependencies, lifecycle: WxAppVoiceLifecycle, options: TaskTransmitDtmfOptions): Promise<void>;
68
+ export declare function mapWxAppVoiceError(error: unknown, method: string, module: string): never;
@@ -0,0 +1,63 @@
1
+ export declare const WXAPP_LOG_FEATURE = "wxApp";
2
+ export declare const WXAPP_LOG_PREFIX = "[CC wxApp]";
3
+ export type WxAppAcceptReason = 'wxApp_offer_ready' | 'wxApp_answer_pending' | 'wxApp_accept_in_flight' | 'extension_non_wxApp_offer' | 'browser_webrtc_offer' | 'outdial_auto_answer';
4
+ export type WxAppSessionSkipReason = 'unsupported_browser_login' | 'flag_disabled' | 'mercury_subscribe_failed' | 'publish_failed';
5
+ export type WxAppTelephonyAction = 'accept' | 'decline' | 'mute' | 'dtmf';
6
+ export type WxAppTelephonyPhase = 'started' | 'success' | 'failed';
7
+ /** Last 8 chars of callId for correlation without logging full id. */
8
+ export declare function callIdSuffix(callId: string | null | undefined): string | undefined;
9
+ export declare function logWxAppSessionReadiness(params: {
10
+ enableWxBetterTogether: boolean;
11
+ loginOption: string | undefined;
12
+ wxAppHooksApplied: boolean;
13
+ usersubPublished: boolean;
14
+ mercurySubscribed: boolean;
15
+ telephonyTaskType: 'Voice' | 'WebRTC' | 'unknown';
16
+ skipReason?: WxAppSessionSkipReason;
17
+ }): void;
18
+ export declare function deriveWxAppAcceptReason(params: {
19
+ isWxAppInboundOffer: boolean;
20
+ isWxAppOutdialOffer: boolean;
21
+ isWebrtc: boolean;
22
+ isOutdial: boolean;
23
+ wxAppAcceptInFlight: boolean;
24
+ wxAppAnswerPending: boolean;
25
+ enableWxBetterTogether: boolean;
26
+ hasDeviceCallId: boolean;
27
+ }): WxAppAcceptReason;
28
+ export declare function logWxAppOfferDecision(params: {
29
+ interactionId: string;
30
+ acceptVisible: boolean;
31
+ acceptEnabled: boolean;
32
+ acceptReason: WxAppAcceptReason;
33
+ wxAppParticipantDeviceType?: string;
34
+ hasDeviceCallId: boolean;
35
+ hasDeviceId?: boolean;
36
+ usersubPublished?: boolean;
37
+ }): void;
38
+ export declare function logWxAppOfferParticipantMismatch(params: {
39
+ interactionId: string;
40
+ usersubPublished: boolean;
41
+ hasDeviceCallId: boolean;
42
+ hasDeviceId: boolean;
43
+ participantDeviceType?: string;
44
+ acceptVisible: boolean;
45
+ acceptEnabled: boolean;
46
+ acceptReason: WxAppAcceptReason;
47
+ }): void;
48
+ export declare function logWxAppTelephonyAction(params: {
49
+ action: WxAppTelephonyAction;
50
+ phase: WxAppTelephonyPhase;
51
+ interactionId?: string;
52
+ trackingId?: string;
53
+ httpStatus?: number | string;
54
+ failureReason?: string;
55
+ }): void;
56
+ export declare function logWxAppValidationFailure(reason: string, interactionId?: string): void;
57
+ export declare function logWxAppMercuryMuteSync(params: {
58
+ phase: 'received' | 'applied' | 'dropped';
59
+ muted?: boolean;
60
+ callIdSuffix?: string;
61
+ interactionId?: string;
62
+ dropReason?: string;
63
+ }): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Expected Hydra responses when mute backfill races call creation (WXCC-6026).
3
+ * These must not be logged as errors — see task-spec wxApp mute backfill guard.
4
+ */
5
+ export declare function isWxAppCallNotFoundError(error: unknown): boolean;