@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
@@ -13,6 +13,7 @@ exports.mapWxAppVoiceError = mapWxAppVoiceError;
13
13
  exports.rejectOnWebex = rejectOnWebex;
14
14
  exports.resolveWxAppLineOwnerId = resolveWxAppLineOwnerId;
15
15
  exports.runWxAppAccept = runWxAppAccept;
16
+ exports.runWxAppOutdialDecline = runWxAppOutdialDecline;
16
17
  exports.runWxAppReject = runWxAppReject;
17
18
  exports.runWxAppToggleMute = runWxAppToggleMute;
18
19
  exports.runWxAppTransmitDtmf = runWxAppTransmitDtmf;
@@ -22,7 +23,10 @@ var _loggerProxy = _interopRequireDefault(require("../../../logger-proxy"));
22
23
  var _constants = require("../../../constants");
23
24
  var _Utils = require("../../core/Utils");
24
25
  var _stateMachine = require("../state-machine");
26
+ var _MetricsManager = _interopRequireDefault(require("../../../metrics/MetricsManager"));
27
+ var _constants2 = require("../../../metrics/constants");
25
28
  var _WebexCallingUtils = require("../WebexCallingUtils");
29
+ var _wxAppDiagnosticLogging = require("../../wxAppDiagnosticLogging");
26
30
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
27
31
  /** @deprecated Use {@link WxAppVoiceDependencies} */
28
32
 
@@ -82,21 +86,82 @@ function resolveWxAppLineOwnerId(deps, override) {
82
86
  }
83
87
  return (0, _WebexCallingUtils.decodedLineOwnerId)(getWxAppLineOwnerId(deps));
84
88
  }
89
+ function getInteractionId(deps) {
90
+ return deps.getTaskData()?.interactionId;
91
+ }
92
+ function logTelephonyFailure(action, deps, error) {
93
+ const wxError = error;
94
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
95
+ action,
96
+ phase: 'failed',
97
+ interactionId: getInteractionId(deps),
98
+ trackingId: wxError.trackingId,
99
+ httpStatus: wxError.status,
100
+ failureReason: wxError.message
101
+ });
102
+ }
103
+ function getWxAppTelephonyMetricFailurePayload(deps, error) {
104
+ const wxError = error;
105
+ const payload = {
106
+ taskId: getInteractionId(deps) ?? '',
107
+ error: error instanceof Error ? error.toString() : String(error)
108
+ };
109
+ if (wxError.trackingId) {
110
+ payload.trackingId = wxError.trackingId;
111
+ }
112
+ return payload;
113
+ }
114
+ function getWxAppOutdialDeclineFailurePayload(deps, error) {
115
+ const base = {
116
+ taskId: getInteractionId(deps) ?? '',
117
+ error: error instanceof Error ? error.toString() : String(error)
118
+ };
119
+ const aqmDetails = error.details;
120
+ if (aqmDetails) {
121
+ return {
122
+ ...base,
123
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(aqmDetails)
124
+ };
125
+ }
126
+ return getWxAppTelephonyMetricFailurePayload(deps, error);
127
+ }
128
+ function logWxAppOutdialDeclineFailure(deps, error) {
129
+ const aqmDetails = error.details;
130
+ const wxError = error;
131
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
132
+ action: 'decline',
133
+ phase: 'failed',
134
+ interactionId: getInteractionId(deps),
135
+ trackingId: aqmDetails?.trackingId ?? wxError.trackingId,
136
+ httpStatus: wxError.status,
137
+ failureReason: aqmDetails?.data?.reason ?? wxError.message
138
+ });
139
+ }
85
140
  function assertWxAppEnabled(deps) {
86
141
  if (!deps.enableWxBetterTogether) {
142
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('enableWxBetterTogether_disabled', getInteractionId(deps));
87
143
  throw new Error('enableWxBetterTogether is disabled');
88
144
  }
89
145
  if (!deps.answerCallOnWebexService) {
146
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('answer_call_on_webex_service_unavailable', getInteractionId(deps));
90
147
  throw new Error('AnswerCallOnWebexService is unavailable');
91
148
  }
92
149
  }
93
150
  async function acceptOnWebex(deps, options) {
151
+ const interactionId = getInteractionId(deps);
152
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
153
+ action: 'accept',
154
+ phase: 'started',
155
+ interactionId
156
+ });
94
157
  assertWxAppEnabled(deps);
95
158
  if (!isWebexAppCallingOffer(deps)) {
159
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('not_wxApp_calling_offer', interactionId);
96
160
  throw new Error('Task is not a wxApp calling offer');
97
161
  }
98
162
  const details = getCallingDeviceDetails(deps);
99
163
  if (!details) {
164
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_device_details_unavailable', interactionId);
100
165
  throw new Error('WxApp calling device details are unavailable');
101
166
  }
102
167
  await deps.answerCallOnWebexService.answerCall({
@@ -104,25 +169,50 @@ async function acceptOnWebex(deps, options) {
104
169
  endpointId: details.deviceId,
105
170
  lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
106
171
  });
172
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
173
+ action: 'accept',
174
+ phase: 'success',
175
+ interactionId
176
+ });
107
177
  }
108
178
  async function rejectOnWebex(deps, options) {
179
+ const interactionId = getInteractionId(deps);
180
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
181
+ action: 'decline',
182
+ phase: 'started',
183
+ interactionId
184
+ });
109
185
  assertWxAppEnabled(deps);
110
186
  if (!isWebexAppInboundCallingOffer(deps)) {
187
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('not_wxApp_inbound_calling_offer', interactionId);
111
188
  throw new Error('Task is not a wxApp inbound calling offer');
112
189
  }
113
190
  const details = getCallingDeviceDetails(deps);
114
191
  if (!details) {
192
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_device_details_unavailable', interactionId);
115
193
  throw new Error('WxApp calling device details are unavailable');
116
194
  }
117
195
  await deps.answerCallOnWebexService.rejectCall({
118
196
  callId: details.deviceCallId,
119
197
  lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
120
198
  });
199
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
200
+ action: 'decline',
201
+ phase: 'success',
202
+ interactionId
203
+ });
121
204
  }
122
205
  async function toggleMuteOnWebex(deps, options) {
206
+ const interactionId = getInteractionId(deps);
207
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
208
+ action: 'mute',
209
+ phase: 'started',
210
+ interactionId
211
+ });
123
212
  assertWxAppEnabled(deps);
124
213
  const callId = getWebexCallingCallId(deps);
125
214
  if (!callId) {
215
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_call_id_unavailable', interactionId);
126
216
  throw new Error('WxApp call ID is unavailable');
127
217
  }
128
218
  const targetMuted = options?.muted ?? !deps.getWxAppMuted();
@@ -132,18 +222,31 @@ async function toggleMuteOnWebex(deps, options) {
132
222
  lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId)
133
223
  });
134
224
  deps.setWxAppMuted(targetMuted);
225
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
226
+ action: 'mute',
227
+ phase: 'success',
228
+ interactionId
229
+ });
135
230
  }
136
231
  async function transmitDtmfOnWebex(deps, options) {
232
+ const interactionId = getInteractionId(deps);
233
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
234
+ action: 'dtmf',
235
+ phase: 'started',
236
+ interactionId
237
+ });
137
238
  assertWxAppEnabled(deps);
138
239
  const callId = getWebexCallingCallId(deps);
139
240
  if (!callId) {
241
+ (0, _wxAppDiagnosticLogging.logWxAppValidationFailure)('wxApp_call_id_unavailable', interactionId);
140
242
  throw new Error('WxApp call ID is unavailable');
141
243
  }
142
244
  _loggerProxy.default.info('transmitDtmf', {
143
245
  module: 'wxAppVoiceMethods',
144
246
  method: _constants.METHODS.TRANSMIT_DTMF,
145
247
  data: {
146
- callId,
248
+ interactionId,
249
+ callIdSuffix: callId.length <= 8 ? callId : callId.slice(-8),
147
250
  dtmfLength: options.dtmf.length,
148
251
  hasLineOwnerId: Boolean(options.lineOwnerId)
149
252
  }
@@ -153,39 +256,89 @@ async function transmitDtmfOnWebex(deps, options) {
153
256
  dtmf: options.dtmf,
154
257
  lineOwnerId: resolveWxAppLineOwnerId(deps, options.lineOwnerId)
155
258
  });
259
+ (0, _wxAppDiagnosticLogging.logWxAppTelephonyAction)({
260
+ action: 'dtmf',
261
+ phase: 'success',
262
+ interactionId
263
+ });
156
264
  }
157
265
  async function runWxAppAccept(deps, lifecycle, options) {
266
+ const taskId = getInteractionId(deps);
267
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED]);
158
268
  try {
159
269
  lifecycle.setWxAppAcceptInFlight(true);
160
270
  lifecycle.setWxAppAnswerPending(true);
161
271
  await acceptOnWebex(deps, options);
162
272
  lifecycle.resetWxAppMuted();
163
273
  await lifecycle.syncWxAppMuteFromCallDetails();
274
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS, {
275
+ taskId
276
+ }, ['operational', 'behavioral']);
164
277
  } catch (error) {
165
278
  lifecycle.setWxAppAnswerPending(false);
279
+ logTelephonyFailure('accept', deps, error);
280
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
166
281
  lifecycle.mapWxAppVoiceError(error, _constants.METHODS.ACCEPT);
167
282
  } finally {
168
283
  lifecycle.setWxAppAcceptInFlight(false);
169
284
  }
170
285
  }
171
286
  async function runWxAppReject(deps, lifecycle, options) {
287
+ const taskId = getInteractionId(deps);
288
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]);
172
289
  try {
173
290
  await rejectOnWebex(deps, options);
291
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {
292
+ taskId
293
+ }, ['operational', 'behavioral']);
174
294
  } catch (error) {
295
+ logTelephonyFailure('decline', deps, error);
296
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
175
297
  lifecycle.mapWxAppVoiceError(error, _constants.METHODS.REJECT);
176
298
  }
177
299
  }
300
+ async function runWxAppOutdialDecline(deps, executeCancel) {
301
+ const taskId = getInteractionId(deps);
302
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED]);
303
+ try {
304
+ const result = await executeCancel();
305
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {
306
+ taskId
307
+ }, ['operational', 'behavioral']);
308
+ return result;
309
+ } catch (error) {
310
+ logWxAppOutdialDeclineFailure(deps, error);
311
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED, getWxAppOutdialDeclineFailurePayload(deps, error), ['operational', 'behavioral']);
312
+ throw error;
313
+ }
314
+ }
178
315
  async function runWxAppToggleMute(deps, lifecycle, options) {
316
+ const taskId = getInteractionId(deps);
317
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED]);
179
318
  try {
180
319
  await toggleMuteOnWebex(deps, options);
320
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS, {
321
+ taskId,
322
+ targetMuted: deps.getWxAppMuted()
323
+ }, ['operational', 'behavioral']);
181
324
  } catch (error) {
325
+ logTelephonyFailure('mute', deps, error);
326
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
182
327
  lifecycle.mapWxAppVoiceError(error, _constants.METHODS.TOGGLE_MUTE);
183
328
  }
184
329
  }
185
330
  async function runWxAppTransmitDtmf(deps, lifecycle, options) {
331
+ const taskId = getInteractionId(deps);
332
+ deps.metricsManager.timeEvent([_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS, _constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED]);
186
333
  try {
187
334
  await transmitDtmfOnWebex(deps, options);
335
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS, {
336
+ taskId,
337
+ dtmfLength: options.dtmf.length
338
+ }, ['operational', 'behavioral']);
188
339
  } catch (error) {
340
+ logTelephonyFailure('dtmf', deps, error);
341
+ deps.metricsManager.trackEvent(_constants2.METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED, getWxAppTelephonyMetricFailurePayload(deps, error), ['operational', 'behavioral']);
189
342
  lifecycle.mapWxAppVoiceError(error, _constants.METHODS.TRANSMIT_DTMF);
190
343
  }
191
344
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_Utils","_stateMachine","_WebexCallingUtils","e","__esModule","default","isWxAppParticipant","participant","deviceType","deviceCallId","trim","deviceId","isOutdialTask","deps","getTaskData","interaction","outboundType","getWxAppAgentParticipant","taskData","participants","agentId","undefined","Object","values","find","id","getCallingDeviceDetails","getWebexCallingDeviceDetailsForAgent","isWebexAppCallingOffer","enableWxBetterTogether","state","getTaskState","TaskState","OFFERED","details","Boolean","isWebexAppInboundCallingOffer","getWebexCallingCallId","IDLE","WRAPPING_UP","TERMINATED","COMPLETED","getWxAppLineOwnerId","lineOwnerId","resolveWxAppLineOwnerId","override","decodedLineOwnerId","assertWxAppEnabled","Error","answerCallOnWebexService","acceptOnWebex","options","answerCall","callId","endpointId","rejectOnWebex","rejectCall","toggleMuteOnWebex","targetMuted","muted","getWxAppMuted","request","muteCall","bind","unmuteCall","setWxAppMuted","transmitDtmfOnWebex","LoggerProxy","info","module","method","METHODS","TRANSMIT_DTMF","data","dtmfLength","dtmf","length","hasLineOwnerId","transmitDtmf","runWxAppAccept","lifecycle","setWxAppAcceptInFlight","setWxAppAnswerPending","resetWxAppMuted","syncWxAppMuteFromCallDetails","error","mapWxAppVoiceError","ACCEPT","runWxAppReject","REJECT","runWxAppToggleMute","TOGGLE_MUTE","runWxAppTransmitDtmf","isWxAppTelephonyError","detailedError","getErrorDetails"],"sources":["wxAppVoiceMethods.ts"],"sourcesContent":["import AnswerCallOnWebexService from '../../AnswerCallOnWebexService';\nimport LoggerProxy from '../../../logger-proxy';\nimport {METHODS} from '../../../constants';\nimport {getErrorDetails} from '../../core/Utils';\nimport {TaskData, TaskToggleMuteOptions, TaskTransmitDtmfOptions} from '../types';\nimport {TaskState} from '../state-machine';\nimport {\n decodedLineOwnerId,\n getWebexCallingDeviceDetailsForAgent,\n WebexCallingDeviceDetails,\n} from '../WebexCallingUtils';\n\ntype WxAppParticipant = {\n deviceType?: string;\n deviceCallId?: string;\n deviceId?: string;\n};\n\nexport type WxAppVoiceDependencies = {\n enableWxBetterTogether: boolean;\n answerCallOnWebexService?: AnswerCallOnWebexService;\n agentId?: string;\n getTaskData: () => TaskData;\n getTaskState: () => TaskState | undefined;\n getWxAppMuted: () => boolean;\n setWxAppMuted: (muted: boolean) => void;\n};\n\n/** @deprecated Use {@link WxAppVoiceDependencies} */\nexport type WxAppVoiceDeps = WxAppVoiceDependencies;\n\nexport type WxAppVoiceLifecycle = {\n setWxAppAcceptInFlight: (inFlight: boolean) => void;\n setWxAppAnswerPending: (pending: boolean) => void;\n resetWxAppMuted: () => void;\n syncWxAppMuteFromCallDetails: () => Promise<boolean | undefined>;\n mapWxAppVoiceError: (error: unknown, method: string) => never;\n};\n\nconst isWxAppParticipant = (participant: unknown): participant is WxAppParticipant =>\n (participant as WxAppParticipant)?.deviceType === 'wxApp' &&\n typeof (participant as WxAppParticipant)?.deviceCallId === 'string' &&\n (participant as WxAppParticipant).deviceCallId.trim() !== '' &&\n typeof (participant as WxAppParticipant)?.deviceId === 'string' &&\n (participant as WxAppParticipant).deviceId.trim() !== '';\n\nconst isOutdialTask = (deps: WxAppVoiceDependencies): boolean =>\n deps.getTaskData()?.interaction?.outboundType === 'OUTDIAL';\n\nfunction getWxAppAgentParticipant(deps: WxAppVoiceDependencies): unknown {\n const taskData = deps.getTaskData();\n const participants = taskData.interaction?.participants;\n const agentId = deps.agentId ?? taskData.agentId;\n\n if (!participants || !agentId) {\n return undefined;\n }\n\n if (participants[agentId]) {\n return participants[agentId];\n }\n\n return Object.values(participants).find(\n (participant) => (participant as {id?: string})?.id === agentId\n );\n}\n\nexport function getCallingDeviceDetails(\n deps: WxAppVoiceDependencies\n): WebexCallingDeviceDetails | undefined {\n const taskData = deps.getTaskData();\n const participant = getWxAppAgentParticipant(deps);\n\n if (!isWxAppParticipant(participant)) {\n return undefined;\n }\n\n return getWebexCallingDeviceDetailsForAgent(\n deps.agentId ?? taskData.agentId,\n taskData.interaction?.participants\n );\n}\n\nexport function isWebexAppCallingOffer(deps: WxAppVoiceDependencies): boolean {\n if (!deps.enableWxBetterTogether) {\n return false;\n }\n\n const state = deps.getTaskState();\n if (state !== TaskState.OFFERED) {\n return false;\n }\n\n const details = getCallingDeviceDetails(deps);\n\n return Boolean(details);\n}\n\n/** Inbound wxApp offer only — outdial decline uses CC routing, not telephony reject. */\nexport function isWebexAppInboundCallingOffer(deps: WxAppVoiceDependencies): boolean {\n return isWebexAppCallingOffer(deps) && !isOutdialTask(deps);\n}\n\nexport function getWebexCallingCallId(deps: WxAppVoiceDependencies): string | null {\n const state = deps.getTaskState();\n if (\n !state ||\n state === TaskState.OFFERED ||\n state === TaskState.IDLE ||\n state === TaskState.WRAPPING_UP ||\n state === TaskState.TERMINATED ||\n state === TaskState.COMPLETED\n ) {\n return null;\n }\n\n return getCallingDeviceDetails(deps)?.deviceCallId ?? null;\n}\n\nexport function getWxAppLineOwnerId(deps: WxAppVoiceDependencies): string | undefined {\n const participant = getWxAppAgentParticipant(deps) as {lineOwnerId?: string} | undefined;\n const lineOwnerId = participant?.lineOwnerId;\n\n return typeof lineOwnerId === 'string' && lineOwnerId.trim() !== '' ? lineOwnerId : undefined;\n}\n\nexport function resolveWxAppLineOwnerId(\n deps: WxAppVoiceDependencies,\n override?: string\n): string | undefined {\n if (typeof override === 'string' && override.trim() !== '') {\n return override;\n }\n\n return decodedLineOwnerId(getWxAppLineOwnerId(deps));\n}\n\nfunction assertWxAppEnabled(deps: WxAppVoiceDependencies): void {\n if (!deps.enableWxBetterTogether) {\n throw new Error('enableWxBetterTogether is disabled');\n }\n\n if (!deps.answerCallOnWebexService) {\n throw new Error('AnswerCallOnWebexService is unavailable');\n }\n}\n\nexport async function acceptOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n assertWxAppEnabled(deps);\n\n if (!isWebexAppCallingOffer(deps)) {\n throw new Error('Task is not a wxApp calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.answerCall({\n callId: details.deviceCallId,\n endpointId: details.deviceId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n}\n\nexport async function rejectOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n assertWxAppEnabled(deps);\n\n if (!isWebexAppInboundCallingOffer(deps)) {\n throw new Error('Task is not a wxApp inbound calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.rejectCall({\n callId: details.deviceCallId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n}\n\nexport async function toggleMuteOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string; muted?: boolean}\n): Promise<void> {\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n throw new Error('WxApp call ID is unavailable');\n }\n\n const targetMuted = options?.muted ?? !deps.getWxAppMuted();\n const request = targetMuted\n ? deps.answerCallOnWebexService.muteCall.bind(deps.answerCallOnWebexService)\n : deps.answerCallOnWebexService.unmuteCall.bind(deps.answerCallOnWebexService);\n\n await request({\n callId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n deps.setWxAppMuted(targetMuted);\n}\n\nexport async function transmitDtmfOnWebex(\n deps: WxAppVoiceDependencies,\n options: {dtmf: string; lineOwnerId?: string}\n): Promise<void> {\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n throw new Error('WxApp call ID is unavailable');\n }\n\n LoggerProxy.info('transmitDtmf', {\n module: 'wxAppVoiceMethods',\n method: METHODS.TRANSMIT_DTMF,\n data: {\n callId,\n dtmfLength: options.dtmf.length,\n hasLineOwnerId: Boolean(options.lineOwnerId),\n },\n });\n\n await deps.answerCallOnWebexService.transmitDtmf({\n callId,\n dtmf: options.dtmf,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options.lineOwnerId),\n });\n}\n\nexport async function runWxAppAccept(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n try {\n lifecycle.setWxAppAcceptInFlight(true);\n lifecycle.setWxAppAnswerPending(true);\n await acceptOnWebex(deps, options);\n lifecycle.resetWxAppMuted();\n await lifecycle.syncWxAppMuteFromCallDetails();\n } catch (error) {\n lifecycle.setWxAppAnswerPending(false);\n lifecycle.mapWxAppVoiceError(error, METHODS.ACCEPT);\n } finally {\n lifecycle.setWxAppAcceptInFlight(false);\n }\n}\n\nexport async function runWxAppReject(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n try {\n await rejectOnWebex(deps, options);\n } catch (error) {\n lifecycle.mapWxAppVoiceError(error, METHODS.REJECT);\n }\n}\n\nexport async function runWxAppToggleMute(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: TaskToggleMuteOptions\n): Promise<void> {\n try {\n await toggleMuteOnWebex(deps, options);\n } catch (error) {\n lifecycle.mapWxAppVoiceError(error, METHODS.TOGGLE_MUTE);\n }\n}\n\nexport async function runWxAppTransmitDtmf(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options: TaskTransmitDtmfOptions\n): Promise<void> {\n try {\n await transmitDtmfOnWebex(deps, options);\n } catch (error) {\n lifecycle.mapWxAppVoiceError(error, METHODS.TRANSMIT_DTMF);\n }\n}\n\nexport function mapWxAppVoiceError(error: unknown, method: string, module: string): never {\n if (\n error instanceof Error &&\n (error as Error & {isWxAppTelephonyError?: boolean}).isWxAppTelephonyError\n ) {\n throw error;\n }\n\n const {error: detailedError} = getErrorDetails(error, method, module);\n throw detailedError;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_Utils","_stateMachine","_MetricsManager","_constants2","_WebexCallingUtils","_wxAppDiagnosticLogging","e","__esModule","default","isWxAppParticipant","participant","deviceType","deviceCallId","trim","deviceId","isOutdialTask","deps","getTaskData","interaction","outboundType","getWxAppAgentParticipant","taskData","participants","agentId","undefined","Object","values","find","id","getCallingDeviceDetails","getWebexCallingDeviceDetailsForAgent","isWebexAppCallingOffer","enableWxBetterTogether","state","getTaskState","TaskState","OFFERED","details","Boolean","isWebexAppInboundCallingOffer","getWebexCallingCallId","IDLE","WRAPPING_UP","TERMINATED","COMPLETED","getWxAppLineOwnerId","lineOwnerId","resolveWxAppLineOwnerId","override","decodedLineOwnerId","getInteractionId","interactionId","logTelephonyFailure","action","error","wxError","logWxAppTelephonyAction","phase","trackingId","httpStatus","status","failureReason","message","getWxAppTelephonyMetricFailurePayload","payload","taskId","Error","toString","String","getWxAppOutdialDeclineFailurePayload","base","aqmDetails","MetricsManager","getCommonTrackingFieldForAQMResponseFailed","logWxAppOutdialDeclineFailure","data","reason","assertWxAppEnabled","logWxAppValidationFailure","answerCallOnWebexService","acceptOnWebex","options","answerCall","callId","endpointId","rejectOnWebex","rejectCall","toggleMuteOnWebex","targetMuted","muted","getWxAppMuted","request","muteCall","bind","unmuteCall","setWxAppMuted","transmitDtmfOnWebex","LoggerProxy","info","module","method","METHODS","TRANSMIT_DTMF","callIdSuffix","length","slice","dtmfLength","dtmf","hasLineOwnerId","transmitDtmf","runWxAppAccept","lifecycle","metricsManager","timeEvent","METRIC_EVENT_NAMES","WXAPP_TASK_ACCEPT_SUCCESS","WXAPP_TASK_ACCEPT_FAILED","setWxAppAcceptInFlight","setWxAppAnswerPending","resetWxAppMuted","syncWxAppMuteFromCallDetails","trackEvent","mapWxAppVoiceError","ACCEPT","runWxAppReject","WXAPP_TASK_DECLINE_SUCCESS","WXAPP_TASK_DECLINE_FAILED","REJECT","runWxAppOutdialDecline","executeCancel","result","runWxAppToggleMute","WXAPP_TASK_MUTE_SUCCESS","WXAPP_TASK_MUTE_FAILED","TOGGLE_MUTE","runWxAppTransmitDtmf","WXAPP_TASK_DTMF_SUCCESS","WXAPP_TASK_DTMF_FAILED","isWxAppTelephonyError","detailedError","getErrorDetails"],"sources":["wxAppVoiceMethods.ts"],"sourcesContent":["import {EventPayload} from '@webex/internal-plugin-metrics/src/metrics.types';\n\nimport AnswerCallOnWebexService, {WxAppTelephonyError} from '../../AnswerCallOnWebexService';\nimport LoggerProxy from '../../../logger-proxy';\nimport {METHODS} from '../../../constants';\nimport {getErrorDetails} from '../../core/Utils';\nimport {Failure} from '../../core/GlobalTypes';\nimport {TaskData, TaskToggleMuteOptions, TaskTransmitDtmfOptions} from '../types';\nimport {TaskState} from '../state-machine';\nimport MetricsManager from '../../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../../metrics/constants';\nimport {\n decodedLineOwnerId,\n getWebexCallingDeviceDetailsForAgent,\n WebexCallingDeviceDetails,\n} from '../WebexCallingUtils';\nimport {\n logWxAppTelephonyAction,\n logWxAppValidationFailure,\n type WxAppTelephonyAction,\n} from '../../wxAppDiagnosticLogging';\n\ntype WxAppParticipant = {\n deviceType?: string;\n deviceCallId?: string;\n deviceId?: string;\n};\n\nexport type WxAppVoiceDependencies = {\n enableWxBetterTogether: boolean;\n answerCallOnWebexService?: AnswerCallOnWebexService;\n agentId?: string;\n metricsManager: MetricsManager;\n getTaskData: () => TaskData;\n getTaskState: () => TaskState | undefined;\n getWxAppMuted: () => boolean;\n setWxAppMuted: (muted: boolean) => void;\n};\n\n/** @deprecated Use {@link WxAppVoiceDependencies} */\nexport type WxAppVoiceDeps = WxAppVoiceDependencies;\n\nexport type WxAppVoiceLifecycle = {\n setWxAppAcceptInFlight: (inFlight: boolean) => void;\n setWxAppAnswerPending: (pending: boolean) => void;\n resetWxAppMuted: () => void;\n syncWxAppMuteFromCallDetails: () => Promise<boolean | undefined>;\n mapWxAppVoiceError: (error: unknown, method: string) => never;\n};\n\nconst isWxAppParticipant = (participant: unknown): participant is WxAppParticipant =>\n (participant as WxAppParticipant)?.deviceType === 'wxApp' &&\n typeof (participant as WxAppParticipant)?.deviceCallId === 'string' &&\n (participant as WxAppParticipant).deviceCallId.trim() !== '' &&\n typeof (participant as WxAppParticipant)?.deviceId === 'string' &&\n (participant as WxAppParticipant).deviceId.trim() !== '';\n\nconst isOutdialTask = (deps: WxAppVoiceDependencies): boolean =>\n deps.getTaskData()?.interaction?.outboundType === 'OUTDIAL';\n\nfunction getWxAppAgentParticipant(deps: WxAppVoiceDependencies): unknown {\n const taskData = deps.getTaskData();\n const participants = taskData.interaction?.participants;\n const agentId = deps.agentId ?? taskData.agentId;\n\n if (!participants || !agentId) {\n return undefined;\n }\n\n if (participants[agentId]) {\n return participants[agentId];\n }\n\n return Object.values(participants).find(\n (participant) => (participant as {id?: string})?.id === agentId\n );\n}\n\nexport function getCallingDeviceDetails(\n deps: WxAppVoiceDependencies\n): WebexCallingDeviceDetails | undefined {\n const taskData = deps.getTaskData();\n const participant = getWxAppAgentParticipant(deps);\n\n if (!isWxAppParticipant(participant)) {\n return undefined;\n }\n\n return getWebexCallingDeviceDetailsForAgent(\n deps.agentId ?? taskData.agentId,\n taskData.interaction?.participants\n );\n}\n\nexport function isWebexAppCallingOffer(deps: WxAppVoiceDependencies): boolean {\n if (!deps.enableWxBetterTogether) {\n return false;\n }\n\n const state = deps.getTaskState();\n if (state !== TaskState.OFFERED) {\n return false;\n }\n\n const details = getCallingDeviceDetails(deps);\n\n return Boolean(details);\n}\n\n/** Inbound wxApp offer only — outdial decline uses CC routing, not telephony reject. */\nexport function isWebexAppInboundCallingOffer(deps: WxAppVoiceDependencies): boolean {\n return isWebexAppCallingOffer(deps) && !isOutdialTask(deps);\n}\n\nexport function getWebexCallingCallId(deps: WxAppVoiceDependencies): string | null {\n const state = deps.getTaskState();\n if (\n !state ||\n state === TaskState.OFFERED ||\n state === TaskState.IDLE ||\n state === TaskState.WRAPPING_UP ||\n state === TaskState.TERMINATED ||\n state === TaskState.COMPLETED\n ) {\n return null;\n }\n\n return getCallingDeviceDetails(deps)?.deviceCallId ?? null;\n}\n\nexport function getWxAppLineOwnerId(deps: WxAppVoiceDependencies): string | undefined {\n const participant = getWxAppAgentParticipant(deps) as {lineOwnerId?: string} | undefined;\n const lineOwnerId = participant?.lineOwnerId;\n\n return typeof lineOwnerId === 'string' && lineOwnerId.trim() !== '' ? lineOwnerId : undefined;\n}\n\nexport function resolveWxAppLineOwnerId(\n deps: WxAppVoiceDependencies,\n override?: string\n): string | undefined {\n if (typeof override === 'string' && override.trim() !== '') {\n return override;\n }\n\n return decodedLineOwnerId(getWxAppLineOwnerId(deps));\n}\n\nfunction getInteractionId(deps: WxAppVoiceDependencies): string | undefined {\n return deps.getTaskData()?.interactionId;\n}\n\nfunction logTelephonyFailure(\n action: WxAppTelephonyAction,\n deps: WxAppVoiceDependencies,\n error: unknown\n): void {\n const wxError = error as WxAppTelephonyError;\n logWxAppTelephonyAction({\n action,\n phase: 'failed',\n interactionId: getInteractionId(deps),\n trackingId: wxError.trackingId,\n httpStatus: wxError.status,\n failureReason: wxError.message,\n });\n}\n\nfunction getWxAppTelephonyMetricFailurePayload(\n deps: WxAppVoiceDependencies,\n error: unknown\n): Record<string, string> {\n const wxError = error as WxAppTelephonyError;\n const payload: Record<string, string> = {\n taskId: getInteractionId(deps) ?? '',\n error: error instanceof Error ? error.toString() : String(error),\n };\n\n if (wxError.trackingId) {\n payload.trackingId = wxError.trackingId;\n }\n\n return payload;\n}\n\ntype AqmWrappedError = {\n details?: Failure;\n};\n\nfunction getWxAppOutdialDeclineFailurePayload(\n deps: WxAppVoiceDependencies,\n error: unknown\n): EventPayload {\n const base: EventPayload = {\n taskId: getInteractionId(deps) ?? '',\n error: error instanceof Error ? error.toString() : String(error),\n };\n const aqmDetails = (error as AqmWrappedError).details;\n\n if (aqmDetails) {\n return {...base, ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(aqmDetails)};\n }\n\n return getWxAppTelephonyMetricFailurePayload(deps, error);\n}\n\nfunction logWxAppOutdialDeclineFailure(deps: WxAppVoiceDependencies, error: unknown): void {\n const aqmDetails = (error as AqmWrappedError).details;\n const wxError = error as WxAppTelephonyError;\n\n logWxAppTelephonyAction({\n action: 'decline',\n phase: 'failed',\n interactionId: getInteractionId(deps),\n trackingId: aqmDetails?.trackingId ?? wxError.trackingId,\n httpStatus: wxError.status,\n failureReason: aqmDetails?.data?.reason ?? wxError.message,\n });\n}\n\nfunction assertWxAppEnabled(deps: WxAppVoiceDependencies): void {\n if (!deps.enableWxBetterTogether) {\n logWxAppValidationFailure('enableWxBetterTogether_disabled', getInteractionId(deps));\n throw new Error('enableWxBetterTogether is disabled');\n }\n\n if (!deps.answerCallOnWebexService) {\n logWxAppValidationFailure('answer_call_on_webex_service_unavailable', getInteractionId(deps));\n throw new Error('AnswerCallOnWebexService is unavailable');\n }\n}\n\nexport async function acceptOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'accept', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n if (!isWebexAppCallingOffer(deps)) {\n logWxAppValidationFailure('not_wxApp_calling_offer', interactionId);\n throw new Error('Task is not a wxApp calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n logWxAppValidationFailure('wxApp_device_details_unavailable', interactionId);\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.answerCall({\n callId: details.deviceCallId,\n endpointId: details.deviceId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'accept', phase: 'success', interactionId});\n}\n\nexport async function rejectOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'decline', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n if (!isWebexAppInboundCallingOffer(deps)) {\n logWxAppValidationFailure('not_wxApp_inbound_calling_offer', interactionId);\n throw new Error('Task is not a wxApp inbound calling offer');\n }\n\n const details = getCallingDeviceDetails(deps);\n if (!details) {\n logWxAppValidationFailure('wxApp_device_details_unavailable', interactionId);\n throw new Error('WxApp calling device details are unavailable');\n }\n\n await deps.answerCallOnWebexService.rejectCall({\n callId: details.deviceCallId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'decline', phase: 'success', interactionId});\n}\n\nexport async function toggleMuteOnWebex(\n deps: WxAppVoiceDependencies,\n options?: {lineOwnerId?: string; muted?: boolean}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'mute', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n logWxAppValidationFailure('wxApp_call_id_unavailable', interactionId);\n throw new Error('WxApp call ID is unavailable');\n }\n\n const targetMuted = options?.muted ?? !deps.getWxAppMuted();\n const request = targetMuted\n ? deps.answerCallOnWebexService.muteCall.bind(deps.answerCallOnWebexService)\n : deps.answerCallOnWebexService.unmuteCall.bind(deps.answerCallOnWebexService);\n\n await request({\n callId,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options?.lineOwnerId),\n });\n deps.setWxAppMuted(targetMuted);\n logWxAppTelephonyAction({action: 'mute', phase: 'success', interactionId});\n}\n\nexport async function transmitDtmfOnWebex(\n deps: WxAppVoiceDependencies,\n options: {dtmf: string; lineOwnerId?: string}\n): Promise<void> {\n const interactionId = getInteractionId(deps);\n logWxAppTelephonyAction({action: 'dtmf', phase: 'started', interactionId});\n assertWxAppEnabled(deps);\n\n const callId = getWebexCallingCallId(deps);\n if (!callId) {\n logWxAppValidationFailure('wxApp_call_id_unavailable', interactionId);\n throw new Error('WxApp call ID is unavailable');\n }\n\n LoggerProxy.info('transmitDtmf', {\n module: 'wxAppVoiceMethods',\n method: METHODS.TRANSMIT_DTMF,\n data: {\n interactionId,\n callIdSuffix: callId.length <= 8 ? callId : callId.slice(-8),\n dtmfLength: options.dtmf.length,\n hasLineOwnerId: Boolean(options.lineOwnerId),\n },\n });\n\n await deps.answerCallOnWebexService.transmitDtmf({\n callId,\n dtmf: options.dtmf,\n lineOwnerId: resolveWxAppLineOwnerId(deps, options.lineOwnerId),\n });\n logWxAppTelephonyAction({action: 'dtmf', phase: 'success', interactionId});\n}\n\nexport async function runWxAppAccept(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED,\n ]);\n\n try {\n lifecycle.setWxAppAcceptInFlight(true);\n lifecycle.setWxAppAnswerPending(true);\n await acceptOnWebex(deps, options);\n lifecycle.resetWxAppMuted();\n await lifecycle.syncWxAppMuteFromCallDetails();\n\n deps.metricsManager.trackEvent(METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_SUCCESS, {taskId}, [\n 'operational',\n 'behavioral',\n ]);\n } catch (error) {\n lifecycle.setWxAppAnswerPending(false);\n logTelephonyFailure('accept', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_ACCEPT_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.ACCEPT);\n } finally {\n lifecycle.setWxAppAcceptInFlight(false);\n }\n}\n\nexport async function runWxAppReject(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: {lineOwnerId?: string}\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n ]);\n\n try {\n await rejectOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {taskId}, [\n 'operational',\n 'behavioral',\n ]);\n } catch (error) {\n logTelephonyFailure('decline', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.REJECT);\n }\n}\n\nexport async function runWxAppOutdialDecline<T>(\n deps: WxAppVoiceDependencies,\n executeCancel: () => Promise<T>\n): Promise<T> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n ]);\n\n try {\n const result = await executeCancel();\n\n deps.metricsManager.trackEvent(METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_SUCCESS, {taskId}, [\n 'operational',\n 'behavioral',\n ]);\n\n return result;\n } catch (error) {\n logWxAppOutdialDeclineFailure(deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DECLINE_FAILED,\n getWxAppOutdialDeclineFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n throw error;\n }\n}\n\nexport async function runWxAppToggleMute(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options?: TaskToggleMuteOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED,\n ]);\n\n try {\n await toggleMuteOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_SUCCESS,\n {taskId, targetMuted: deps.getWxAppMuted()},\n ['operational', 'behavioral']\n );\n } catch (error) {\n logTelephonyFailure('mute', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_MUTE_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.TOGGLE_MUTE);\n }\n}\n\nexport async function runWxAppTransmitDtmf(\n deps: WxAppVoiceDependencies,\n lifecycle: WxAppVoiceLifecycle,\n options: TaskTransmitDtmfOptions\n): Promise<void> {\n const taskId = getInteractionId(deps);\n\n deps.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS,\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED,\n ]);\n\n try {\n await transmitDtmfOnWebex(deps, options);\n\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_SUCCESS,\n {taskId, dtmfLength: options.dtmf.length},\n ['operational', 'behavioral']\n );\n } catch (error) {\n logTelephonyFailure('dtmf', deps, error);\n deps.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.WXAPP_TASK_DTMF_FAILED,\n getWxAppTelephonyMetricFailurePayload(deps, error),\n ['operational', 'behavioral']\n );\n lifecycle.mapWxAppVoiceError(error, METHODS.TRANSMIT_DTMF);\n }\n}\n\nexport function mapWxAppVoiceError(error: unknown, method: string, module: string): never {\n if (\n error instanceof Error &&\n (error as Error & {isWxAppTelephonyError?: boolean}).isWxAppTelephonyError\n ) {\n throw error;\n }\n\n const {error: detailedError} = getErrorDetails(error, method, module);\n throw detailedError;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.WXAPP_LOG_PREFIX = exports.WXAPP_LOG_FEATURE = void 0;
7
+ exports.callIdSuffix = callIdSuffix;
8
+ exports.deriveWxAppAcceptReason = deriveWxAppAcceptReason;
9
+ exports.logWxAppMercuryMuteSync = logWxAppMercuryMuteSync;
10
+ exports.logWxAppOfferDecision = logWxAppOfferDecision;
11
+ exports.logWxAppSessionReadiness = logWxAppSessionReadiness;
12
+ exports.logWxAppTelephonyAction = logWxAppTelephonyAction;
13
+ exports.logWxAppValidationFailure = logWxAppValidationFailure;
14
+ var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const WXAPP_LOG_FEATURE = exports.WXAPP_LOG_FEATURE = 'wxApp';
17
+ const WXAPP_LOG_PREFIX = exports.WXAPP_LOG_PREFIX = '[CC wxApp]';
18
+ /** Last 8 chars of callId for correlation without logging full id. */
19
+ function callIdSuffix(callId) {
20
+ if (!callId) {
21
+ return undefined;
22
+ }
23
+ return callId.length <= 8 ? callId : callId.slice(-8);
24
+ }
25
+ function logWxApp(message, method, data) {
26
+ _loggerProxy.default.info(`${WXAPP_LOG_PREFIX} ${message}`, {
27
+ module: 'wxAppDiagnosticLogging',
28
+ method,
29
+ data: {
30
+ feature: WXAPP_LOG_FEATURE,
31
+ ...data
32
+ }
33
+ });
34
+ }
35
+ function logWxAppError(message, method, data) {
36
+ _loggerProxy.default.error(`${WXAPP_LOG_PREFIX} ${message}`, {
37
+ module: 'wxAppDiagnosticLogging',
38
+ method,
39
+ data: {
40
+ feature: WXAPP_LOG_FEATURE,
41
+ ...data
42
+ }
43
+ });
44
+ }
45
+ function logWxAppSessionReadiness(params) {
46
+ logWxApp('session readiness', 'logWxAppSessionReadiness', {
47
+ event: 'session_readiness',
48
+ enableWxBetterTogether: params.enableWxBetterTogether,
49
+ loginOption: params.loginOption,
50
+ wxAppHooksApplied: params.wxAppHooksApplied,
51
+ usersubPublished: params.usersubPublished,
52
+ mercurySubscribed: params.mercurySubscribed,
53
+ telephonyTaskType: params.telephonyTaskType,
54
+ skipReason: params.skipReason
55
+ });
56
+ }
57
+ function deriveWxAppAcceptReason(params) {
58
+ if (params.isWxAppInboundOffer || params.isWxAppOutdialOffer) {
59
+ if (params.wxAppAcceptInFlight) {
60
+ return 'wxApp_accept_in_flight';
61
+ }
62
+ if (params.wxAppAnswerPending) {
63
+ return 'wxApp_answer_pending';
64
+ }
65
+ return 'wxApp_offer_ready';
66
+ }
67
+ if (params.isWebrtc && !params.isOutdial) {
68
+ return 'browser_webrtc_offer';
69
+ }
70
+ if (params.isOutdial) {
71
+ return 'outdial_auto_answer';
72
+ }
73
+ if (params.enableWxBetterTogether && !params.hasDeviceCallId) {
74
+ return 'extension_non_wxApp_offer';
75
+ }
76
+ return 'extension_non_wxApp_offer';
77
+ }
78
+ function logWxAppOfferDecision(params) {
79
+ logWxApp('offer decision', 'logWxAppOfferDecision', {
80
+ event: 'offer_decision',
81
+ interactionId: params.interactionId,
82
+ acceptVisible: params.acceptVisible,
83
+ acceptEnabled: params.acceptEnabled,
84
+ acceptReason: params.acceptReason,
85
+ wxAppParticipantDeviceType: params.wxAppParticipantDeviceType,
86
+ hasDeviceCallId: params.hasDeviceCallId
87
+ });
88
+ }
89
+ function logWxAppTelephonyAction(params) {
90
+ const payload = {
91
+ event: 'telephony_action',
92
+ action: params.action,
93
+ phase: params.phase,
94
+ interactionId: params.interactionId,
95
+ trackingId: params.trackingId,
96
+ httpStatus: params.httpStatus,
97
+ failureReason: params.failureReason
98
+ };
99
+ if (params.phase === 'failed') {
100
+ logWxAppError(`telephony ${params.action} ${params.phase}`, 'logWxAppTelephonyAction', payload);
101
+ } else {
102
+ logWxApp(`telephony ${params.action} ${params.phase}`, 'logWxAppTelephonyAction', payload);
103
+ }
104
+ }
105
+ function logWxAppValidationFailure(reason, interactionId) {
106
+ logWxAppError('validation failed', 'logWxAppValidationFailure', {
107
+ event: 'validation_failed',
108
+ reason,
109
+ interactionId
110
+ });
111
+ }
112
+ function logWxAppMercuryMuteSync(params) {
113
+ logWxApp(`mercury mute sync ${params.phase}`, 'logWxAppMercuryMuteSync', {
114
+ event: 'mercury_mute_sync',
115
+ phase: params.phase,
116
+ muted: params.muted,
117
+ callIdSuffix: params.callIdSuffix,
118
+ interactionId: params.interactionId,
119
+ dropReason: params.dropReason
120
+ });
121
+ }
122
+ //# sourceMappingURL=wxAppDiagnosticLogging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_loggerProxy","_interopRequireDefault","require","e","__esModule","default","WXAPP_LOG_FEATURE","exports","WXAPP_LOG_PREFIX","callIdSuffix","callId","undefined","length","slice","logWxApp","message","method","data","LoggerProxy","info","module","feature","logWxAppError","error","logWxAppSessionReadiness","params","event","enableWxBetterTogether","loginOption","wxAppHooksApplied","usersubPublished","mercurySubscribed","telephonyTaskType","skipReason","deriveWxAppAcceptReason","isWxAppInboundOffer","isWxAppOutdialOffer","wxAppAcceptInFlight","wxAppAnswerPending","isWebrtc","isOutdial","hasDeviceCallId","logWxAppOfferDecision","interactionId","acceptVisible","acceptEnabled","acceptReason","wxAppParticipantDeviceType","logWxAppTelephonyAction","payload","action","phase","trackingId","httpStatus","failureReason","logWxAppValidationFailure","reason","logWxAppMercuryMuteSync","muted","dropReason"],"sources":["wxAppDiagnosticLogging.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\n\nexport const WXAPP_LOG_FEATURE = 'wxApp';\nexport const WXAPP_LOG_PREFIX = '[CC wxApp]';\n\nexport type WxAppAcceptReason =\n | 'wxApp_offer_ready'\n | 'wxApp_answer_pending'\n | 'wxApp_accept_in_flight'\n | 'extension_non_wxApp_offer'\n | 'browser_webrtc_offer'\n | 'outdial_auto_answer';\n\nexport type WxAppSessionSkipReason =\n | 'unsupported_browser_login'\n | 'flag_disabled'\n | 'mercury_subscribe_failed'\n | 'publish_failed';\n\nexport type WxAppTelephonyAction = 'accept' | 'decline' | 'mute' | 'dtmf';\nexport type WxAppTelephonyPhase = 'started' | 'success' | 'failed';\n\ntype WxAppLogData = Record<string, string | boolean | number | undefined>;\n\n/** Last 8 chars of callId for correlation without logging full id. */\nexport function callIdSuffix(callId: string | null | undefined): string | undefined {\n if (!callId) {\n return undefined;\n }\n\n return callId.length <= 8 ? callId : callId.slice(-8);\n}\n\nfunction logWxApp(message: string, method: string, data: WxAppLogData): void {\n LoggerProxy.info(`${WXAPP_LOG_PREFIX} ${message}`, {\n module: 'wxAppDiagnosticLogging',\n method,\n data: {feature: WXAPP_LOG_FEATURE, ...data},\n });\n}\n\nfunction logWxAppError(message: string, method: string, data: WxAppLogData): void {\n LoggerProxy.error(`${WXAPP_LOG_PREFIX} ${message}`, {\n module: 'wxAppDiagnosticLogging',\n method,\n data: {feature: WXAPP_LOG_FEATURE, ...data},\n });\n}\n\nexport function logWxAppSessionReadiness(params: {\n enableWxBetterTogether: boolean;\n loginOption: string | undefined;\n wxAppHooksApplied: boolean;\n usersubPublished: boolean;\n mercurySubscribed: boolean;\n telephonyTaskType: 'Voice' | 'WebRTC' | 'unknown';\n skipReason?: WxAppSessionSkipReason;\n}): void {\n logWxApp('session readiness', 'logWxAppSessionReadiness', {\n event: 'session_readiness',\n enableWxBetterTogether: params.enableWxBetterTogether,\n loginOption: params.loginOption,\n wxAppHooksApplied: params.wxAppHooksApplied,\n usersubPublished: params.usersubPublished,\n mercurySubscribed: params.mercurySubscribed,\n telephonyTaskType: params.telephonyTaskType,\n skipReason: params.skipReason,\n });\n}\n\nexport function deriveWxAppAcceptReason(params: {\n isWxAppInboundOffer: boolean;\n isWxAppOutdialOffer: boolean;\n isWebrtc: boolean;\n isOutdial: boolean;\n wxAppAcceptInFlight: boolean;\n wxAppAnswerPending: boolean;\n enableWxBetterTogether: boolean;\n hasDeviceCallId: boolean;\n}): WxAppAcceptReason {\n if (params.isWxAppInboundOffer || params.isWxAppOutdialOffer) {\n if (params.wxAppAcceptInFlight) {\n return 'wxApp_accept_in_flight';\n }\n if (params.wxAppAnswerPending) {\n return 'wxApp_answer_pending';\n }\n\n return 'wxApp_offer_ready';\n }\n\n if (params.isWebrtc && !params.isOutdial) {\n return 'browser_webrtc_offer';\n }\n\n if (params.isOutdial) {\n return 'outdial_auto_answer';\n }\n\n if (params.enableWxBetterTogether && !params.hasDeviceCallId) {\n return 'extension_non_wxApp_offer';\n }\n\n return 'extension_non_wxApp_offer';\n}\n\nexport function logWxAppOfferDecision(params: {\n interactionId: string;\n acceptVisible: boolean;\n acceptEnabled: boolean;\n acceptReason: WxAppAcceptReason;\n wxAppParticipantDeviceType?: string;\n hasDeviceCallId: boolean;\n}): void {\n logWxApp('offer decision', 'logWxAppOfferDecision', {\n event: 'offer_decision',\n interactionId: params.interactionId,\n acceptVisible: params.acceptVisible,\n acceptEnabled: params.acceptEnabled,\n acceptReason: params.acceptReason,\n wxAppParticipantDeviceType: params.wxAppParticipantDeviceType,\n hasDeviceCallId: params.hasDeviceCallId,\n });\n}\n\nexport function logWxAppTelephonyAction(params: {\n action: WxAppTelephonyAction;\n phase: WxAppTelephonyPhase;\n interactionId?: string;\n trackingId?: string;\n httpStatus?: number | string;\n failureReason?: string;\n}): void {\n const payload: WxAppLogData = {\n event: 'telephony_action',\n action: params.action,\n phase: params.phase,\n interactionId: params.interactionId,\n trackingId: params.trackingId,\n httpStatus: params.httpStatus,\n failureReason: params.failureReason,\n };\n\n if (params.phase === 'failed') {\n logWxAppError(`telephony ${params.action} ${params.phase}`, 'logWxAppTelephonyAction', payload);\n } else {\n logWxApp(`telephony ${params.action} ${params.phase}`, 'logWxAppTelephonyAction', payload);\n }\n}\n\nexport function logWxAppValidationFailure(reason: string, interactionId?: string): void {\n logWxAppError('validation failed', 'logWxAppValidationFailure', {\n event: 'validation_failed',\n reason,\n interactionId,\n });\n}\n\nexport function logWxAppMercuryMuteSync(params: {\n phase: 'received' | 'applied' | 'dropped';\n muted?: boolean;\n callIdSuffix?: string;\n interactionId?: string;\n dropReason?: string;\n}): void {\n logWxApp(`mercury mute sync ${params.phase}`, 'logWxAppMercuryMuteSync', {\n event: 'mercury_mute_sync',\n phase: params.phase,\n muted: params.muted,\n callIdSuffix: params.callIdSuffix,\n interactionId: params.interactionId,\n dropReason: params.dropReason,\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -618,6 +618,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
618
618
  * @private
619
619
  */
620
620
  private resetEnableWxBetterTogetherConfig;
621
+ private getWxAppTelephonyTaskType;
621
622
  private ensureWxAppPostStationLogin;
622
623
  private clearWxAppFalsePublishRetryTimer;
623
624
  private scheduleForcedFalsePublishRetry;
@@ -178,6 +178,12 @@ export default class MetricsManager {
178
178
  * MetricsManager.getInstance().timeEvent(['AGENT_LOGIN', 'AGENT_LOGOUT']);
179
179
  */
180
180
  timeEvent(keys: string | string[]): void;
181
+ /**
182
+ * Clears a running timed event without emitting a metric.
183
+ * @param keys - A string or array of strings representing event keys (same as timeEvent).
184
+ * @public
185
+ */
186
+ cancelTimedEvent(keys: string | string[]): void;
181
187
  /**
182
188
  * Sets the Webex SDK instance and marks the manager as ready when the SDK is ready.
183
189
  * @param webex - The Webex SDK instance.
@@ -130,6 +130,21 @@ export declare const METRIC_EVENT_NAMES: {
130
130
  readonly TASK_SWITCH_CALL_FAILED: "Task Switch Call Failed";
131
131
  readonly TASK_OUTDIAL_SUCCESS: "Task Outdial Success";
132
132
  readonly TASK_OUTDIAL_FAILED: "Task Outdial Failed";
133
+ readonly WXAPP_TASK_MUTE_SUCCESS: "WxApp Task Mute Success";
134
+ readonly WXAPP_TASK_MUTE_FAILED: "WxApp Task Mute Failed";
135
+ readonly WXAPP_TASK_DTMF_SUCCESS: "WxApp Task Dtmf Success";
136
+ readonly WXAPP_TASK_DTMF_FAILED: "WxApp Task Dtmf Failed";
137
+ readonly WXAPP_TASK_ACCEPT_SUCCESS: "WxApp Task Accept Success";
138
+ readonly WXAPP_TASK_ACCEPT_FAILED: "WxApp Task Accept Failed";
139
+ readonly WXAPP_TASK_DECLINE_SUCCESS: "WxApp Task Decline Success";
140
+ readonly WXAPP_TASK_DECLINE_FAILED: "WxApp Task Decline Failed";
141
+ readonly WXAPP_SESSION_INIT_SUCCESS: "WxApp Session Init Success";
142
+ readonly WXAPP_SESSION_INIT_FAILED: "WxApp Session Init Failed";
143
+ readonly WXAPP_SESSION_SKIPPED: "WxApp Session Skipped";
144
+ readonly WXAPP_USERSUB_PUBLISH_SUCCESS: "WxApp Usersub Publish Success";
145
+ readonly WXAPP_USERSUB_PUBLISH_FAILED: "WxApp Usersub Publish Failed";
146
+ readonly WXAPP_MERCURY_SUBSCRIBE_SUCCESS: "WxApp Mercury Subscribe Success";
147
+ readonly WXAPP_MERCURY_SUBSCRIBE_FAILED: "WxApp Mercury Subscribe Failed";
133
148
  readonly UPLOAD_LOGS_SUCCESS: "Upload Logs Success";
134
149
  readonly UPLOAD_LOGS_FAILED: "Upload Logs Failed";
135
150
  readonly WEBSOCKET_DEREGISTER_SUCCESS: "Websocket Deregister Success";
@@ -27,6 +27,7 @@ export default class AnswerCallOnWebexService {
27
27
  private webex;
28
28
  constructor(webex: WebexSDK);
29
29
  private getTelephonyBaseUrl;
30
+ private extractTrackingId;
30
31
  private telephonyRequest;
31
32
  answerCall(params: AnswerCallParams): Promise<IHttpResponse>;
32
33
  rejectCall(params: CallIdParams): Promise<IHttpResponse>;
@@ -10,6 +10,8 @@ export default class WebexCrossClientService {
10
10
  private appName;
11
11
  /** Incremented on teardown/disable to ignore stale refresh timer callbacks. */
12
12
  private refreshGeneration;
13
+ /** Monotonic id for usersub publish metrics timers; stale publishes cancel only their own timer. */
14
+ private usersubPublishMetricsId;
13
15
  constructor(webex: WebexSDK);
14
16
  private extractDeviceIdFromUrl;
15
17
  private getDeviceUrl;
@@ -21,7 +23,9 @@ export default class WebexCrossClientService {
21
23
  userId?: string;
22
24
  ttl?: number;
23
25
  appName?: string;
26
+ trackPublishMetrics?: boolean;
24
27
  }): Promise<void>;
28
+ private trackUsersubPreflightFailure;
25
29
  teardown(): void;
26
30
  /** Whether usersub `answer-calls-on-wxcc: true` was successfully published this session. */
27
31
  isAnswerCallsStateActive(): boolean;