@webex/contact-center 3.12.0-llmrefactor.7 → 3.12.0-llmrefactor.9

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 (69) hide show
  1. package/.sdd/manifest.json +3 -2
  2. package/ai-docs/CONTRACTS.md +3 -2
  3. package/dist/cc.js +108 -6
  4. package/dist/cc.js.map +1 -1
  5. package/dist/metrics/MetricsManager.js +16 -0
  6. package/dist/metrics/MetricsManager.js.map +1 -1
  7. package/dist/metrics/behavioral-events.js +91 -0
  8. package/dist/metrics/behavioral-events.js.map +1 -1
  9. package/dist/metrics/constants.js +16 -0
  10. package/dist/metrics/constants.js.map +1 -1
  11. package/dist/services/AnswerCallOnWebexService.js +34 -6
  12. package/dist/services/AnswerCallOnWebexService.js.map +1 -1
  13. package/dist/services/WebexCrossClientService.js +54 -3
  14. package/dist/services/WebexCrossClientService.js.map +1 -1
  15. package/dist/services/WxAppTelephonyMercurySync.js +21 -6
  16. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -1
  17. package/dist/services/task/state-machine/TaskStateMachine.js +0 -17
  18. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  19. package/dist/services/task/state-machine/guards.js +7 -37
  20. package/dist/services/task/state-machine/guards.js.map +1 -1
  21. package/dist/services/task/voice/Voice.js +81 -14
  22. package/dist/services/task/voice/Voice.js.map +1 -1
  23. package/dist/services/task/voice/wxAppVoiceMethods.js +154 -1
  24. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -1
  25. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  26. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  27. package/dist/types/cc.d.ts +1 -0
  28. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  29. package/dist/types/metrics/constants.d.ts +15 -0
  30. package/dist/types/services/AnswerCallOnWebexService.d.ts +1 -0
  31. package/dist/types/services/WebexCrossClientService.d.ts +4 -0
  32. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +0 -42
  33. package/dist/types/services/task/state-machine/guards.d.ts +4 -4
  34. package/dist/types/services/task/voice/Voice.d.ts +5 -1
  35. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +3 -0
  36. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  37. package/dist/webex.js +1 -1
  38. package/package.json +8 -8
  39. package/src/cc.ts +155 -7
  40. package/src/metrics/MetricsManager.ts +16 -0
  41. package/src/metrics/ai-docs/metrics-spec.md +71 -9
  42. package/src/metrics/behavioral-events.ts +92 -0
  43. package/src/metrics/constants.ts +18 -0
  44. package/src/services/AnswerCallOnWebexService.ts +41 -8
  45. package/src/services/WebexCrossClientService.ts +85 -4
  46. package/src/services/WxAppTelephonyMercurySync.ts +31 -4
  47. package/src/services/agent/ai-docs/agent-spec.md +1 -0
  48. package/src/services/task/ai-docs/task-spec.md +17 -16
  49. package/src/services/task/state-machine/TaskStateMachine.ts +0 -20
  50. package/src/services/task/state-machine/ai-docs/AGENTS.md +2 -4
  51. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +8 -9
  52. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +5 -7
  53. package/src/services/task/state-machine/guards.ts +7 -63
  54. package/src/services/task/voice/Voice.ts +115 -26
  55. package/src/services/task/voice/wxAppVoiceMethods.ts +211 -2
  56. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  57. package/test/unit/spec/cc.ts +251 -22
  58. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  59. package/test/unit/spec/metrics/behavioral-events.ts +42 -0
  60. package/test/unit/spec/services/AnswerCallOnWebexService.ts +41 -0
  61. package/test/unit/spec/services/WebexCrossClientService.ts +207 -1
  62. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +23 -0
  63. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +72 -46
  64. package/test/unit/spec/services/task/state-machine/guards.ts +6 -6
  65. package/test/unit/spec/services/task/voice/Voice.ts +380 -0
  66. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +145 -1
  67. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  68. package/umd/contact-center.min.js +2 -2
  69. package/umd/contact-center.min.js.map +1 -1
@@ -0,0 +1,143 @@
1
+ import LoggerProxy from '../../../../src/logger-proxy';
2
+ import {
3
+ callIdSuffix,
4
+ deriveWxAppAcceptReason,
5
+ logWxAppOfferDecision,
6
+ logWxAppSessionReadiness,
7
+ logWxAppTelephonyAction,
8
+ WXAPP_LOG_PREFIX,
9
+ } from '../../../../src/services/wxAppDiagnosticLogging';
10
+
11
+ jest.mock('../../../../src/logger-proxy', () => ({
12
+ info: jest.fn(),
13
+ error: jest.fn(),
14
+ }));
15
+
16
+ describe('wxAppDiagnosticLogging', () => {
17
+ beforeEach(() => {
18
+ jest.clearAllMocks();
19
+ });
20
+
21
+ describe('callIdSuffix', () => {
22
+ it('returns last 8 characters for long call ids', () => {
23
+ expect(callIdSuffix('prefix:abcdefghijklmnop')).toBe('ijklmnop');
24
+ });
25
+
26
+ it('returns full id when length is 8 or less', () => {
27
+ expect(callIdSuffix('abc')).toBe('abc');
28
+ });
29
+ });
30
+
31
+ describe('deriveWxAppAcceptReason', () => {
32
+ it('returns wxApp_offer_ready for wxApp inbound offer', () => {
33
+ expect(
34
+ deriveWxAppAcceptReason({
35
+ isWxAppInboundOffer: true,
36
+ isWxAppOutdialOffer: false,
37
+ isWebrtc: false,
38
+ isOutdial: false,
39
+ wxAppAcceptInFlight: false,
40
+ wxAppAnswerPending: false,
41
+ enableWxBetterTogether: true,
42
+ hasDeviceCallId: true,
43
+ })
44
+ ).toBe('wxApp_offer_ready');
45
+ });
46
+
47
+ it('returns extension_non_wxApp_offer when flag on but no device call id', () => {
48
+ expect(
49
+ deriveWxAppAcceptReason({
50
+ isWxAppInboundOffer: false,
51
+ isWxAppOutdialOffer: false,
52
+ isWebrtc: false,
53
+ isOutdial: false,
54
+ wxAppAcceptInFlight: false,
55
+ wxAppAnswerPending: false,
56
+ enableWxBetterTogether: true,
57
+ hasDeviceCallId: false,
58
+ })
59
+ ).toBe('extension_non_wxApp_offer');
60
+ });
61
+
62
+ it('returns wxApp_answer_pending when answer is pending', () => {
63
+ expect(
64
+ deriveWxAppAcceptReason({
65
+ isWxAppInboundOffer: true,
66
+ isWxAppOutdialOffer: false,
67
+ isWebrtc: false,
68
+ isOutdial: false,
69
+ wxAppAcceptInFlight: false,
70
+ wxAppAnswerPending: true,
71
+ enableWxBetterTogether: true,
72
+ hasDeviceCallId: true,
73
+ })
74
+ ).toBe('wxApp_answer_pending');
75
+ });
76
+ });
77
+
78
+ describe('log helpers', () => {
79
+ it('logs session readiness with feature prefix', () => {
80
+ logWxAppSessionReadiness({
81
+ enableWxBetterTogether: true,
82
+ loginOption: 'EXTENSION',
83
+ wxAppHooksApplied: true,
84
+ usersubPublished: true,
85
+ mercurySubscribed: true,
86
+ telephonyTaskType: 'Voice',
87
+ });
88
+
89
+ expect(LoggerProxy.info).toHaveBeenCalledWith(
90
+ `${WXAPP_LOG_PREFIX} session readiness`,
91
+ expect.objectContaining({
92
+ module: 'wxAppDiagnosticLogging',
93
+ method: 'logWxAppSessionReadiness',
94
+ data: expect.objectContaining({
95
+ feature: 'wxApp',
96
+ event: 'session_readiness',
97
+ loginOption: 'EXTENSION',
98
+ }),
99
+ })
100
+ );
101
+ });
102
+
103
+ it('logs offer decision with acceptReason', () => {
104
+ logWxAppOfferDecision({
105
+ interactionId: 'task-1',
106
+ acceptVisible: true,
107
+ acceptEnabled: false,
108
+ acceptReason: 'extension_non_wxApp_offer',
109
+ hasDeviceCallId: false,
110
+ });
111
+
112
+ expect(LoggerProxy.info).toHaveBeenCalledWith(
113
+ `${WXAPP_LOG_PREFIX} offer decision`,
114
+ expect.objectContaining({
115
+ data: expect.objectContaining({
116
+ event: 'offer_decision',
117
+ acceptReason: 'extension_non_wxApp_offer',
118
+ interactionId: 'task-1',
119
+ }),
120
+ })
121
+ );
122
+ });
123
+
124
+ it('logs telephony failures at error level with trackingId', () => {
125
+ logWxAppTelephonyAction({
126
+ action: 'accept',
127
+ phase: 'failed',
128
+ interactionId: 'task-1',
129
+ trackingId: 'track-abc',
130
+ failureReason: 'REST error',
131
+ });
132
+
133
+ expect(LoggerProxy.error).toHaveBeenCalledWith(
134
+ `${WXAPP_LOG_PREFIX} telephony accept failed`,
135
+ expect.objectContaining({
136
+ data: expect.objectContaining({
137
+ trackingId: 'track-abc',
138
+ }),
139
+ })
140
+ );
141
+ });
142
+ });
143
+ });