@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.
- package/.sdd/manifest.json +887 -0
- package/AGENTS.md +94 -0
- package/ai-docs/ARCHITECTURE.md +168 -0
- package/ai-docs/CONTRACTS.md +62 -0
- package/ai-docs/GETTING_STARTED.md +168 -0
- package/ai-docs/GLOSSARY.md +43 -0
- package/ai-docs/README.md +138 -0
- package/ai-docs/REVIEW_CHECKLIST.md +41 -0
- package/ai-docs/RULES.md +444 -0
- package/ai-docs/SECURITY.md +52 -0
- package/ai-docs/SERVICE_STATE.md +52 -0
- package/ai-docs/SPEC_INDEX.md +65 -0
- package/ai-docs/adr/0001-spec-source-policy.md +55 -0
- package/ai-docs/adr/README.md +8 -0
- package/ai-docs/adr/_adr-template.md +31 -0
- package/ai-docs/contact-center-spec.md +385 -0
- package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
- package/ai-docs/features/contact-owner-change-refactor.md +78 -0
- package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
- package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
- package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
- package/ai-docs/patterns/event-driven-patterns.md +485 -0
- package/ai-docs/patterns/testing-patterns.md +480 -0
- package/ai-docs/patterns/typescript-patterns.md +365 -0
- package/ai-docs/templates/README.md +102 -0
- package/ai-docs/templates/documentation/create-agents-md.md +240 -0
- package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
- package/ai-docs/templates/existing-service/bug-fix.md +254 -0
- package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
- package/ai-docs/templates/new-method/00-master.md +80 -0
- package/ai-docs/templates/new-method/01-requirements.md +232 -0
- package/ai-docs/templates/new-method/02-implementation.md +295 -0
- package/ai-docs/templates/new-method/03-tests.md +201 -0
- package/ai-docs/templates/new-method/04-validation.md +141 -0
- package/ai-docs/templates/new-service/00-master.md +109 -0
- package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
- package/ai-docs/templates/new-service/02-code-generation.md +346 -0
- package/ai-docs/templates/new-service/03-integration.md +178 -0
- package/ai-docs/templates/new-service/04-test-generation.md +205 -0
- package/ai-docs/templates/new-service/05-validation.md +145 -0
- package/dist/cc.js +888 -49
- package/dist/cc.js.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +38 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js +54 -17
- package/dist/index.js.map +1 -1
- package/dist/metrics/MetricsManager.js +16 -0
- package/dist/metrics/MetricsManager.js.map +1 -1
- package/dist/metrics/behavioral-events.js +185 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +54 -4
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +18 -15
- package/dist/services/AddressBook.js.map +1 -1
- package/dist/services/AnswerCallOnWebexService.js +202 -0
- package/dist/services/AnswerCallOnWebexService.js.map +1 -0
- package/dist/services/ApiAiAssistant.js +369 -14
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/EntryPoint.js +46 -68
- package/dist/services/EntryPoint.js.map +1 -1
- package/dist/services/Queue.js +27 -22
- package/dist/services/Queue.js.map +1 -1
- package/dist/services/UserPreference.js +427 -0
- package/dist/services/UserPreference.js.map +1 -0
- package/dist/services/WebCallingService.js +10 -2
- package/dist/services/WebCallingService.js.map +1 -1
- package/dist/services/WebexCrossClientService.js +225 -0
- package/dist/services/WebexCrossClientService.js.map +1 -0
- package/dist/services/WxAppTelephonyMercurySync.js +111 -0
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
- package/dist/services/config/Util.js +48 -48
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +56 -78
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +100 -226
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +93 -24
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js +11 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +131 -32
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/WebexRequest.js +6 -2
- package/dist/services/core/WebexRequest.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +17 -11
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/constants.js +9 -1
- package/dist/services/core/constants.js.map +1 -1
- package/dist/services/core/types.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +19 -2
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/types.js.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/task/Task.js +955 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +50 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +1272 -605
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +221 -27
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/WebexCallingUtils.js +70 -0
- package/dist/services/task/WebexCallingUtils.js.map +1 -0
- package/dist/services/task/constants.js +19 -2
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +29 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/digital/Digital.js +78 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +982 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +572 -0
- package/dist/services/task/state-machine/actions.js.map +1 -0
- package/dist/services/task/state-machine/constants.js +161 -0
- package/dist/services/task/state-machine/constants.js.map +1 -0
- package/dist/services/task/state-machine/guards.js +379 -0
- package/dist/services/task/state-machine/guards.js.map +1 -0
- package/dist/services/task/state-machine/index.js +53 -0
- package/dist/services/task/state-machine/index.js.map +1 -0
- package/dist/services/task/state-machine/types.js +54 -0
- package/dist/services/task/state-machine/types.js.map +1 -0
- package/dist/services/task/state-machine/uiControlsComputer.js +703 -0
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
- package/dist/services/task/taskDataNormalizer.js +99 -0
- package/dist/services/task/taskDataNormalizer.js.map +1 -0
- package/dist/services/task/types.js +215 -5
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1504 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +152 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
- package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js +395 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
- package/dist/services/wxAppDiagnosticLogging.js +159 -0
- package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
- package/dist/services/wxAppTelephonyUtils.js +19 -0
- package/dist/services/wxAppTelephonyUtils.js.map +1 -0
- package/dist/types/cc.d.ts +152 -9
- package/dist/types/config.d.ts +13 -0
- package/dist/types/constants.d.ts +36 -1
- package/dist/types/index.d.ts +54 -20
- package/dist/types/metrics/MetricsManager.d.ts +6 -0
- package/dist/types/metrics/constants.d.ts +48 -1
- package/dist/types/services/AddressBook.d.ts +2 -1
- package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
- package/dist/types/services/ApiAiAssistant.d.ts +67 -5
- package/dist/types/services/EntryPoint.d.ts +7 -5
- package/dist/types/services/Queue.d.ts +5 -3
- package/dist/types/services/UserPreference.d.ts +118 -0
- package/dist/types/services/WebexCrossClientService.d.ts +32 -0
- package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
- package/dist/types/services/config/Util.d.ts +4 -8
- package/dist/types/services/config/constants.d.ts +49 -76
- package/dist/types/services/config/index.d.ts +16 -64
- package/dist/types/services/config/types.d.ts +240 -114
- package/dist/types/services/constants.d.ts +9 -0
- package/dist/types/services/core/Err.d.ts +2 -0
- package/dist/types/services/core/Utils.d.ts +43 -13
- package/dist/types/services/core/WebexRequest.d.ts +1 -0
- package/dist/types/services/core/constants.d.ts +7 -0
- package/dist/types/services/core/types.d.ts +2 -0
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
- package/dist/types/services/core/websocket/types.d.ts +1 -1
- package/dist/types/services/index.d.ts +1 -1
- package/dist/types/services/task/Task.d.ts +186 -0
- package/dist/types/services/task/TaskFactory.d.ts +14 -0
- package/dist/types/services/task/TaskUtils.d.ts +54 -2
- package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
- package/dist/types/services/task/constants.d.ts +17 -0
- package/dist/types/services/task/contact.d.ts +4 -0
- package/dist/types/services/task/digital/Digital.d.ts +23 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1442 -0
- package/dist/types/services/task/state-machine/actions.d.ts +10 -0
- package/dist/types/services/task/state-machine/constants.d.ts +107 -0
- package/dist/types/services/task/state-machine/guards.d.ts +103 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +277 -0
- package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
- package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
- package/dist/types/services/task/types.d.ts +738 -66
- package/dist/types/services/task/voice/Voice.d.ts +241 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +54 -0
- package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +68 -0
- package/dist/types/services/wxAppDiagnosticLogging.d.ts +63 -0
- package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
- package/dist/types/types.d.ts +213 -11
- package/dist/types/utils/PageCache.d.ts +20 -3
- package/dist/types/webex.d.ts +1 -0
- package/dist/types.js +168 -6
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +19 -5
- package/dist/utils/PageCache.js.map +1 -1
- package/dist/webex.js +22 -2
- package/dist/webex.js.map +1 -1
- package/package.json +16 -12
- package/src/cc.ts +1137 -67
- package/src/config.ts +13 -0
- package/src/constants.ts +39 -1
- package/src/index.ts +62 -15
- package/src/metrics/MetricsManager.ts +16 -0
- package/src/metrics/ai-docs/AGENTS.md +350 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
- package/src/metrics/ai-docs/metrics-spec.md +971 -0
- package/src/metrics/behavioral-events.ts +190 -0
- package/src/metrics/constants.ts +59 -4
- package/src/services/AddressBook.ts +17 -6
- package/src/services/AnswerCallOnWebexService.ts +239 -0
- package/src/services/ApiAiAssistant.ts +494 -15
- package/src/services/EntryPoint.ts +59 -60
- package/src/services/Queue.ts +29 -12
- package/src/services/UserPreference.ts +509 -0
- package/src/services/WebCallingService.ts +16 -2
- package/src/services/WebexCrossClientService.ts +298 -0
- package/src/services/WxAppTelephonyMercurySync.ts +142 -0
- package/src/services/agent/ai-docs/AGENTS.md +240 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
- package/src/services/agent/ai-docs/agent-spec.md +505 -0
- package/src/services/ai-docs/AGENTS.md +386 -0
- package/src/services/ai-docs/services-spec.md +512 -0
- package/src/services/config/Util.ts +54 -84
- package/src/services/config/ai-docs/AGENTS.md +250 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +413 -0
- package/src/services/config/ai-docs/config-spec.md +669 -0
- package/src/services/config/constants.ts +63 -85
- package/src/services/config/index.ts +116 -277
- package/src/services/config/types.ts +229 -125
- package/src/services/constants.ts +10 -0
- package/src/services/core/Err.ts +1 -0
- package/src/services/core/Utils.ts +151 -37
- package/src/services/core/WebexRequest.ts +3 -1
- package/src/services/core/ai-docs/AGENTS.md +381 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
- package/src/services/core/ai-docs/core-spec.md +797 -0
- package/src/services/core/aqm-reqs.ts +18 -12
- package/src/services/core/constants.ts +8 -0
- package/src/services/core/types.ts +33 -1
- package/src/services/core/websocket/WebSocketManager.ts +28 -2
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +1 -1
- package/src/services/task/Task.ts +1211 -0
- package/src/services/task/TaskFactory.ts +82 -0
- package/src/services/task/TaskManager.ts +1585 -724
- package/src/services/task/TaskUtils.ts +316 -25
- package/src/services/task/WebexCallingUtils.ts +136 -0
- package/src/services/task/ai-docs/AGENTS.md +457 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
- package/src/services/task/ai-docs/task-spec.md +1501 -0
- package/src/services/task/constants.ts +18 -0
- package/src/services/task/contact.ts +30 -0
- package/src/services/task/digital/Digital.ts +102 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +1320 -0
- package/src/services/task/state-machine/actions.ts +741 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +460 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1156 -0
- package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2247 -0
- package/src/services/task/state-machine/constants.ts +172 -0
- package/src/services/task/state-machine/guards.ts +442 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +258 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +918 -70
- package/src/services/task/voice/Voice.ts +1878 -0
- package/src/services/task/voice/WebRTC.ts +194 -0
- package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
- package/src/services/task/voice/wxAppVoiceMethods.ts +575 -0
- package/src/services/wxAppDiagnosticLogging.ts +286 -0
- package/src/services/wxAppTelephonyUtils.ts +14 -0
- package/src/types.ts +272 -13
- package/src/utils/AGENTS.md +289 -0
- package/src/utils/PageCache.ts +38 -5
- package/src/utils/ai-docs/utils-spec.md +391 -0
- package/src/webex.js +10 -0
- package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
- package/test/unit/spec/cc.ts +3553 -107
- package/test/unit/spec/index.ts +885 -0
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/metrics/MetricsManager.ts +25 -0
- package/test/unit/spec/metrics/behavioral-events.ts +60 -0
- package/test/unit/spec/services/AddressBook.ts +37 -6
- package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +442 -23
- package/test/unit/spec/services/EntryPoint.ts +87 -40
- package/test/unit/spec/services/Queue.ts +123 -12
- package/test/unit/spec/services/UserPreference.ts +401 -0
- package/test/unit/spec/services/WebCallingService.ts +45 -1
- package/test/unit/spec/services/WebexCrossClientService.ts +509 -0
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
- package/test/unit/spec/services/config/Util.ts +501 -0
- package/test/unit/spec/services/config/index.ts +317 -547
- package/test/unit/spec/services/core/Utils.ts +447 -8
- package/test/unit/spec/services/core/WebexRequest.ts +8 -7
- package/test/unit/spec/services/core/aqm-reqs.ts +142 -1
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +129 -53
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +2723 -0
- package/test/unit/spec/services/task/TaskFactory.ts +116 -0
- package/test/unit/spec/services/task/TaskManager.ts +4734 -1769
- package/test/unit/spec/services/task/TaskUtils.ts +307 -0
- package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
- package/test/unit/spec/services/task/contact.ts +33 -0
- package/test/unit/spec/services/task/digital/Digital.ts +105 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +4060 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +2355 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
- package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +719 -0
- package/test/unit/spec/services/wxAppDiagnosticLogging.ts +179 -0
- package/test/unit/spec/wellnessSampleUtils.ts +288 -0
- package/typedoc.md +1 -1
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
- package/dist/services/task/index.js +0 -1530
- package/dist/services/task/index.js.map +0 -1
- package/dist/types/services/task/index.d.ts +0 -650
- package/src/services/task/index.ts +0 -1806
- package/test/unit/spec/services/task/index.ts +0 -2205
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.ApiAIAssistant = void 0;
|
|
7
|
+
var _uuid = require("uuid");
|
|
7
8
|
var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
|
|
8
9
|
var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
|
|
9
10
|
var _constants = require("../metrics/constants");
|
|
@@ -17,8 +18,24 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
17
18
|
* @public
|
|
18
19
|
*/
|
|
19
20
|
class ApiAIAssistant {
|
|
20
|
-
|
|
21
|
+
/** @internal Current AI flags from the agent configuration. */
|
|
22
|
+
|
|
23
|
+
pendingRtdRequests = new Map();
|
|
24
|
+
createWellnessError(reason) {
|
|
25
|
+
const error = new Error(reason);
|
|
26
|
+
error.details = {
|
|
27
|
+
type: 'SDK_VALIDATION_ERROR',
|
|
28
|
+
orgId: this.webex.credentials.getOrgId(),
|
|
29
|
+
trackingId: '',
|
|
30
|
+
data: {
|
|
31
|
+
reason
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return error;
|
|
35
|
+
}
|
|
36
|
+
constructor(webex, wellnessContextProvider) {
|
|
21
37
|
this.webex = webex;
|
|
38
|
+
this.wellnessContextProvider = wellnessContextProvider;
|
|
22
39
|
this.metricsManager = _MetricsManager.default.getInstance({
|
|
23
40
|
webex
|
|
24
41
|
});
|
|
@@ -26,12 +43,126 @@ class ApiAIAssistant {
|
|
|
26
43
|
setAIFeatureFlags(aiFeature) {
|
|
27
44
|
this.aiFeature = aiFeature;
|
|
28
45
|
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Validates a caller-supplied identifier (agentId/interactionId) before it is used to
|
|
49
|
+
* construct a request. Accepts a non-empty alphanumeric identifier that may contain
|
|
50
|
+
* hyphens or underscores.
|
|
51
|
+
* @param value - the identifier to validate
|
|
52
|
+
* @returns {boolean} true when the identifier is a non-empty, well-formed string
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
isValidTranscriptIdentifier(value) {
|
|
56
|
+
return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);
|
|
57
|
+
}
|
|
58
|
+
async sendWellnessBreakAction(action, method) {
|
|
59
|
+
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
|
|
60
|
+
try {
|
|
61
|
+
const context = this.wellnessContextProvider?.();
|
|
62
|
+
const agentId = context?.agentId?.trim();
|
|
63
|
+
const agentSessionId = context?.agentSessionId?.trim();
|
|
64
|
+
const orgId = this.webex.credentials.getOrgId()?.trim();
|
|
65
|
+
if (context?.isWellnessBreakEnabled !== true) {
|
|
66
|
+
throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');
|
|
67
|
+
}
|
|
68
|
+
if (!orgId) {
|
|
69
|
+
throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');
|
|
70
|
+
}
|
|
71
|
+
if (!agentId) {
|
|
72
|
+
throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');
|
|
73
|
+
}
|
|
74
|
+
if (!agentSessionId) {
|
|
75
|
+
throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');
|
|
76
|
+
}
|
|
77
|
+
const baseUrl = this.getBaseUrl();
|
|
78
|
+
const response = await this.webex.request({
|
|
79
|
+
uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
|
|
80
|
+
method: _types.HTTP_METHODS.POST,
|
|
81
|
+
addAuthHeader: true,
|
|
82
|
+
body: {
|
|
83
|
+
agentId,
|
|
84
|
+
orgId,
|
|
85
|
+
eventType: _types.AIAssistantEventType.CUSTOM_EVENT,
|
|
86
|
+
eventName: _types.AIAssistantEventName.WELLNESS_BREAK_ACTION,
|
|
87
|
+
eventDetails: {
|
|
88
|
+
data: {
|
|
89
|
+
action,
|
|
90
|
+
agentSessionId,
|
|
91
|
+
actionTimeStamp: Date.now()
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (response.statusCode !== 202) {
|
|
97
|
+
throw this.createWellnessError(`WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`);
|
|
98
|
+
}
|
|
99
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, {
|
|
100
|
+
action
|
|
101
|
+
}, ['operational']);
|
|
102
|
+
_loggerProxy.default.log('Wellness action accepted by AI Assistant', {
|
|
103
|
+
module: _constants2.CC_FILE,
|
|
104
|
+
method,
|
|
105
|
+
data: {
|
|
106
|
+
action
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
} catch (error) {
|
|
110
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED, {
|
|
111
|
+
action,
|
|
112
|
+
error: error instanceof Error ? error.message : String(error)
|
|
113
|
+
}, ['operational']);
|
|
114
|
+
const {
|
|
115
|
+
error: detailedError
|
|
116
|
+
} = (0, _Utils.getErrorDetails)(error, method, _constants2.CC_FILE);
|
|
117
|
+
throw detailedError;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Requests an Agent Wellness Break.
|
|
123
|
+
* The promise resolves when the HTTP request is accepted with status 202; the later
|
|
124
|
+
* approval or denial is delivered independently through a wellness notification.
|
|
125
|
+
* @returns A promise that resolves with no value after HTTP acceptance
|
|
126
|
+
* @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
|
|
127
|
+
* @example
|
|
128
|
+
* await webex.cc.apiAIAssistant.requestWellnessBreak();
|
|
129
|
+
* @public
|
|
130
|
+
*/
|
|
131
|
+
async requestWellnessBreak() {
|
|
132
|
+
return this.sendWellnessBreakAction(_types.WELLNESS_BREAK_USER_ACTIONS.REQUESTED, _constants2.METHODS.REQUEST_WELLNESS_BREAK);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Responds to a backend-provided Agent Wellness Break offer.
|
|
137
|
+
* The promise resolves when the HTTP request is accepted with status 202 and does not
|
|
138
|
+
* wait for a WebSocket completion event.
|
|
139
|
+
* @param params - ACCEPTED, REJECTED, or NO_RESPONSE
|
|
140
|
+
* @returns A promise that resolves with no value after HTTP acceptance
|
|
141
|
+
* @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
|
|
142
|
+
* @example
|
|
143
|
+
* await webex.cc.apiAIAssistant.respondToWellnessBreak({
|
|
144
|
+
* action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,
|
|
145
|
+
* });
|
|
146
|
+
* @public
|
|
147
|
+
*/
|
|
148
|
+
async respondToWellnessBreak(params) {
|
|
149
|
+
const {
|
|
150
|
+
action
|
|
151
|
+
} = params;
|
|
152
|
+
if (![_types.WELLNESS_BREAK_USER_ACTIONS.ACCEPTED, _types.WELLNESS_BREAK_USER_ACTIONS.REJECTED, _types.WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE].includes(action)) {
|
|
153
|
+
const {
|
|
154
|
+
error
|
|
155
|
+
} = (0, _Utils.getErrorDetails)(this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'), _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK, _constants2.CC_FILE);
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
return this.sendWellnessBreakAction(action, _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK);
|
|
159
|
+
}
|
|
29
160
|
getBaseUrl() {
|
|
30
161
|
const wccApiGatewayUrl = this.webex.internal.services.get(_constants3.WCC_API_GATEWAY) || '';
|
|
31
162
|
if (!wccApiGatewayUrl) {
|
|
32
163
|
const {
|
|
33
164
|
error: detailedError
|
|
34
|
-
} = (0, _Utils.getErrorDetails)(new Error(
|
|
165
|
+
} = (0, _Utils.getErrorDetails)(new Error(_constants2.AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
|
|
35
166
|
throw detailedError;
|
|
36
167
|
}
|
|
37
168
|
let hostname = '';
|
|
@@ -44,11 +175,78 @@ class ApiAIAssistant {
|
|
|
44
175
|
if (!resolvedEnv) {
|
|
45
176
|
const {
|
|
46
177
|
error: detailedError
|
|
47
|
-
} = (0, _Utils.getErrorDetails)(new Error(
|
|
178
|
+
} = (0, _Utils.getErrorDetails)(new Error(_constants2.AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE), _constants2.METHODS.GET_BASE_URL, _constants2.CC_FILE);
|
|
48
179
|
throw detailedError;
|
|
49
180
|
}
|
|
50
181
|
return _constants3.AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);
|
|
51
182
|
}
|
|
183
|
+
static getRtdRequestKey(rtdEventType, correlationId) {
|
|
184
|
+
return JSON.stringify([rtdEventType, correlationId]);
|
|
185
|
+
}
|
|
186
|
+
removeRtdRequest(rtdEventType, correlationId, settle) {
|
|
187
|
+
const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);
|
|
188
|
+
const request = this.pendingRtdRequests.get(key);
|
|
189
|
+
if (!request) {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
if (request.timeoutId) {
|
|
193
|
+
clearTimeout(request.timeoutId);
|
|
194
|
+
}
|
|
195
|
+
settle?.(request);
|
|
196
|
+
this.pendingRtdRequests.delete(key);
|
|
197
|
+
return request;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** Sends an AI event and waits for its matching RTD response. @internal */
|
|
201
|
+
async requestAndWaitForRtd(options) {
|
|
202
|
+
const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);
|
|
203
|
+
let resolveResult = () => undefined;
|
|
204
|
+
let rejectResult = () => undefined;
|
|
205
|
+
const result = new Promise((resolve, reject) => {
|
|
206
|
+
resolveResult = resolve;
|
|
207
|
+
rejectResult = reject;
|
|
208
|
+
});
|
|
209
|
+
const previousRequest = this.pendingRtdRequests.get(key);
|
|
210
|
+
if (previousRequest?.timeoutId) {
|
|
211
|
+
clearTimeout(previousRequest.timeoutId);
|
|
212
|
+
}
|
|
213
|
+
const request = {
|
|
214
|
+
correlationId: options.correlationId,
|
|
215
|
+
rtdEventType: options.rtdEventType,
|
|
216
|
+
resolve: resolveResult,
|
|
217
|
+
reject: rejectResult
|
|
218
|
+
};
|
|
219
|
+
request.timeoutId = setTimeout(() => {
|
|
220
|
+
this.removeRtdRequest(options.rtdEventType, options.correlationId, currentRequest => {
|
|
221
|
+
currentRequest.reject(options.createTimeoutError());
|
|
222
|
+
});
|
|
223
|
+
}, options.timeoutMs);
|
|
224
|
+
this.pendingRtdRequests.set(key, request);
|
|
225
|
+
const publishTimestamp = options.publishTimestamp ?? Date.now();
|
|
226
|
+
const acknowledgement = Promise.resolve().then(() => this.sendEvent(options.agentId, options.interactionId, options.eventType, options.eventName, options.eventMetaData, undefined, undefined, publishTimestamp, options.timeout)).catch(error => {
|
|
227
|
+
this.removeRtdRequest(options.rtdEventType, options.correlationId);
|
|
228
|
+
throw error;
|
|
229
|
+
});
|
|
230
|
+
const [payload] = await Promise.all([result, acknowledgement]);
|
|
231
|
+
return payload;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** Resolves a pending request from a parsed RTD event. @internal */
|
|
235
|
+
resolveFromRtdEvent(rtdEventType, correlationId, payload) {
|
|
236
|
+
const request = this.removeRtdRequest(rtdEventType, correlationId, currentRequest => {
|
|
237
|
+
currentRequest.resolve(payload);
|
|
238
|
+
});
|
|
239
|
+
return request ? 'resolved' : 'not-found';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Clears pending RTD requests when the RTD lifecycle ends. @internal */
|
|
243
|
+
clearAllRtdRequests() {
|
|
244
|
+
Array.from(this.pendingRtdRequests.values()).forEach(request => {
|
|
245
|
+
this.removeRtdRequest(request.rtdEventType, request.correlationId, currentRequest => {
|
|
246
|
+
currentRequest.reject(new Error('RTD request cleared'));
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
}
|
|
52
250
|
|
|
53
251
|
/**
|
|
54
252
|
* Sends an event to the AI Assistant service.
|
|
@@ -56,9 +254,11 @@ class ApiAIAssistant {
|
|
|
56
254
|
* @param interactionId - interaction/conversation identifier
|
|
57
255
|
* @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
|
|
58
256
|
* @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
|
|
59
|
-
* @param
|
|
257
|
+
* @param eventMetaData - event-specific fields to include in eventDetails.data
|
|
258
|
+
* @param languageCode - language code within eventDetails.data
|
|
259
|
+
* @param trackingId - tracking identifier within eventDetails.data
|
|
60
260
|
*/
|
|
61
|
-
async sendEvent(agentId, interactionId, eventType, eventName,
|
|
261
|
+
async sendEvent(agentId, interactionId, eventType, eventName, eventMetaData, languageCode, trackingId, publishTimestamp, timeout) {
|
|
62
262
|
_loggerProxy.default.info('Sending event', {
|
|
63
263
|
module: _constants2.CC_FILE,
|
|
64
264
|
method: _constants2.METHODS.SEND_EVENT,
|
|
@@ -66,28 +266,37 @@ class ApiAIAssistant {
|
|
|
66
266
|
data: {
|
|
67
267
|
eventType,
|
|
68
268
|
eventName,
|
|
69
|
-
|
|
269
|
+
eventMetaData
|
|
70
270
|
}
|
|
71
271
|
});
|
|
72
272
|
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED]);
|
|
73
273
|
try {
|
|
74
274
|
const baseUrl = this.getBaseUrl();
|
|
75
275
|
const orgId = this.webex.credentials.getOrgId();
|
|
276
|
+
const data = {
|
|
277
|
+
...eventMetaData,
|
|
278
|
+
interactionId,
|
|
279
|
+
actionTimeStamp: String(Date.now()),
|
|
280
|
+
languageCode,
|
|
281
|
+
trackingId
|
|
282
|
+
};
|
|
76
283
|
const response = await this.webex.request({
|
|
77
284
|
uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
|
|
78
285
|
method: _types.HTTP_METHODS.POST,
|
|
79
286
|
addAuthHeader: true,
|
|
287
|
+
...(timeout !== undefined ? {
|
|
288
|
+
timeout
|
|
289
|
+
} : {}),
|
|
80
290
|
body: {
|
|
81
291
|
agentId,
|
|
82
292
|
orgId,
|
|
83
293
|
eventType,
|
|
84
294
|
eventName,
|
|
295
|
+
...(publishTimestamp !== undefined ? {
|
|
296
|
+
publishTimestamp
|
|
297
|
+
} : {}),
|
|
85
298
|
eventDetails: {
|
|
86
|
-
data
|
|
87
|
-
interactionId,
|
|
88
|
-
action,
|
|
89
|
-
actionTimeStamp: String(Date.now())
|
|
90
|
-
}
|
|
299
|
+
data
|
|
91
300
|
}
|
|
92
301
|
}
|
|
93
302
|
});
|
|
@@ -96,8 +305,7 @@ class ApiAIAssistant {
|
|
|
96
305
|
orgId,
|
|
97
306
|
interactionId,
|
|
98
307
|
eventType,
|
|
99
|
-
eventName
|
|
100
|
-
action
|
|
308
|
+
eventName
|
|
101
309
|
}, ['operational']);
|
|
102
310
|
return response?.body || {};
|
|
103
311
|
} catch (error) {
|
|
@@ -105,7 +313,6 @@ class ApiAIAssistant {
|
|
|
105
313
|
interactionId,
|
|
106
314
|
eventType,
|
|
107
315
|
eventName,
|
|
108
|
-
action,
|
|
109
316
|
error: error instanceof Error ? error.message : String(error)
|
|
110
317
|
}, ['operational']);
|
|
111
318
|
const {
|
|
@@ -115,6 +322,148 @@ class ApiAIAssistant {
|
|
|
115
322
|
}
|
|
116
323
|
}
|
|
117
324
|
|
|
325
|
+
/**
|
|
326
|
+
* Requests real-time assistance for an interaction.
|
|
327
|
+
*
|
|
328
|
+
* @param params - Real-time assistance request parameters
|
|
329
|
+
* @returns HTTP response body from the AI Assistant event API
|
|
330
|
+
* @public
|
|
331
|
+
*/
|
|
332
|
+
async getRealTimeAssistance(params) {
|
|
333
|
+
const {
|
|
334
|
+
agentId,
|
|
335
|
+
interactionId,
|
|
336
|
+
context
|
|
337
|
+
} = params;
|
|
338
|
+
const trimmedContext = context?.trim();
|
|
339
|
+
const languageCode = params.languageCode ?? 'en';
|
|
340
|
+
const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
|
|
341
|
+
const eventName = trimmedContext ? _types.AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT : _types.AIAssistantEventName.GET_SUGGESTIONS;
|
|
342
|
+
const loggerContext = {
|
|
343
|
+
module: _constants2.CC_FILE,
|
|
344
|
+
method: _constants2.METHODS.GET_REAL_TIME_ASSISTANCE,
|
|
345
|
+
interactionId,
|
|
346
|
+
trackingId,
|
|
347
|
+
data: {
|
|
348
|
+
eventName
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
_loggerProxy.default.info('Requesting real-time assistance', loggerContext);
|
|
352
|
+
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED]);
|
|
353
|
+
try {
|
|
354
|
+
if (!this.aiFeature?.suggestedResponses?.enable) {
|
|
355
|
+
const {
|
|
356
|
+
error: detailedError
|
|
357
|
+
} = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
|
|
358
|
+
throw detailedError;
|
|
359
|
+
}
|
|
360
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
361
|
+
const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, eventName, trimmedContext !== undefined ? {
|
|
362
|
+
context: trimmedContext
|
|
363
|
+
} : undefined, languageCode, trackingId);
|
|
364
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, {
|
|
365
|
+
agentId,
|
|
366
|
+
orgId,
|
|
367
|
+
interactionId,
|
|
368
|
+
eventName,
|
|
369
|
+
trackingId,
|
|
370
|
+
context
|
|
371
|
+
}, ['operational']);
|
|
372
|
+
_loggerProxy.default.log('Real-time assistance request succeeded', loggerContext);
|
|
373
|
+
return response;
|
|
374
|
+
} catch (error) {
|
|
375
|
+
_loggerProxy.default.error('Real-time assistance request failed', {
|
|
376
|
+
...loggerContext,
|
|
377
|
+
error
|
|
378
|
+
});
|
|
379
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED, {
|
|
380
|
+
agentId,
|
|
381
|
+
interactionId,
|
|
382
|
+
trackingId,
|
|
383
|
+
eventName,
|
|
384
|
+
error: error instanceof Error ? error.message : String(error)
|
|
385
|
+
}, ['operational']);
|
|
386
|
+
const {
|
|
387
|
+
error: detailedError
|
|
388
|
+
} = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
|
|
389
|
+
throw detailedError;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Sends user action feedback for a real-time assistance adaptive card.
|
|
395
|
+
*
|
|
396
|
+
* @param params - Real-time assistance user action parameters
|
|
397
|
+
* @returns HTTP response body from the AI Assistant event API
|
|
398
|
+
* @public
|
|
399
|
+
*/
|
|
400
|
+
async sendRealTimeAssistanceUserAction(params) {
|
|
401
|
+
const {
|
|
402
|
+
agentId,
|
|
403
|
+
interactionId,
|
|
404
|
+
adaptiveCardId,
|
|
405
|
+
actionId
|
|
406
|
+
} = params;
|
|
407
|
+
const actionType = 'Action.Submit';
|
|
408
|
+
const languageCode = params.languageCode ?? 'en';
|
|
409
|
+
const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
|
|
410
|
+
const loggerContext = {
|
|
411
|
+
module: _constants2.CC_FILE,
|
|
412
|
+
method: _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
|
|
413
|
+
interactionId,
|
|
414
|
+
trackingId,
|
|
415
|
+
data: {
|
|
416
|
+
actionId,
|
|
417
|
+
adaptiveCardId
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
_loggerProxy.default.info('Sending real-time assistance user action', loggerContext);
|
|
421
|
+
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED]);
|
|
422
|
+
try {
|
|
423
|
+
if (!this.aiFeature?.suggestedResponses?.enable) {
|
|
424
|
+
const {
|
|
425
|
+
error: detailedError
|
|
426
|
+
} = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
|
|
427
|
+
throw detailedError;
|
|
428
|
+
}
|
|
429
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
430
|
+
const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, _types.AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION, {
|
|
431
|
+
adaptiveCardId,
|
|
432
|
+
userAction: {
|
|
433
|
+
actionType,
|
|
434
|
+
actionId
|
|
435
|
+
}
|
|
436
|
+
}, languageCode, trackingId);
|
|
437
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, {
|
|
438
|
+
agentId,
|
|
439
|
+
orgId,
|
|
440
|
+
interactionId,
|
|
441
|
+
adaptiveCardId,
|
|
442
|
+
actionId,
|
|
443
|
+
trackingId
|
|
444
|
+
}, ['operational']);
|
|
445
|
+
_loggerProxy.default.log('Real-time assistance user action sent', loggerContext);
|
|
446
|
+
return response;
|
|
447
|
+
} catch (error) {
|
|
448
|
+
_loggerProxy.default.error('Real-time assistance user action failed', {
|
|
449
|
+
...loggerContext,
|
|
450
|
+
error
|
|
451
|
+
});
|
|
452
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED, {
|
|
453
|
+
agentId,
|
|
454
|
+
interactionId,
|
|
455
|
+
adaptiveCardId,
|
|
456
|
+
actionId,
|
|
457
|
+
trackingId,
|
|
458
|
+
error: error instanceof Error ? error.message : String(error)
|
|
459
|
+
}, ['operational']);
|
|
460
|
+
const {
|
|
461
|
+
error: detailedError
|
|
462
|
+
} = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
|
|
463
|
+
throw detailedError;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
118
467
|
/**
|
|
119
468
|
* Fetches historic transcripts for an interaction.
|
|
120
469
|
* This API is allowed only when real-time transcription feature is enabled.
|
|
@@ -134,6 +483,12 @@ class ApiAIAssistant {
|
|
|
134
483
|
} = (0, _Utils.getErrorDetails)(new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
|
|
135
484
|
throw detailedError;
|
|
136
485
|
}
|
|
486
|
+
if (!this.isValidTranscriptIdentifier(agentId) || !this.isValidTranscriptIdentifier(interactionId)) {
|
|
487
|
+
const {
|
|
488
|
+
error: detailedError
|
|
489
|
+
} = (0, _Utils.getErrorDetails)(new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
|
|
490
|
+
throw detailedError;
|
|
491
|
+
}
|
|
137
492
|
try {
|
|
138
493
|
const baseUrl = this.getBaseUrl();
|
|
139
494
|
const orgId = this.webex.credentials.getOrgId();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","constructor","webex","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","getBaseUrl","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","error","detailedError","getErrorDetails","Error","METHODS","GET_BASE_URL","CC_FILE","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","sendEvent","agentId","interactionId","eventType","eventName","action","LoggerProxy","info","module","method","SEND_EVENT","data","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","baseUrl","orgId","credentials","getOrgId","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventDetails","actionTimeStamp","String","Date","now","trackEvent","message","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","enable","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n TranscriptAction,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n public aiFeature: AIFeatureFlags;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error('AI_ASSISTANT_BASE_URL_NOT_AVAILABLE'),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param action - action within eventDetails (e.g. 'START' or 'STOP')\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n action: TranscriptAction\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, action},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n eventDetails: {\n data: {\n interactionId,\n action,\n actionTimeStamp: String(Date.now()),\n },\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName, action},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_uuid","require","_loggerProxy","_interopRequireDefault","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","pendingRtdRequests","Map","createWellnessError","reason","error","Error","details","type","orgId","webex","credentials","getOrgId","trackingId","data","constructor","wellnessContextProvider","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","isValidTranscriptIdentifier","value","test","sendWellnessBreakAction","action","method","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED","AI_ASSISTANT_WELLNESS_ACTION_FAILED","context","agentId","trim","agentSessionId","isWellnessBreakEnabled","baseUrl","getBaseUrl","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventType","AIAssistantEventType","CUSTOM_EVENT","eventName","AIAssistantEventName","WELLNESS_BREAK_ACTION","eventDetails","actionTimeStamp","Date","now","statusCode","trackEvent","LoggerProxy","log","module","CC_FILE","message","String","detailedError","getErrorDetails","requestWellnessBreak","WELLNESS_BREAK_USER_ACTIONS","REQUESTED","METHODS","REQUEST_WELLNESS_BREAK","respondToWellnessBreak","params","ACCEPTED","REJECTED","NO_RESPONSE","includes","RESPOND_TO_WELLNESS_BREAK","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","AI_SUMMARY_ERROR_CODES","AI_ASSISTANT_BASE_URL_NOT_AVAILABLE","GET_BASE_URL","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","getRtdRequestKey","rtdEventType","correlationId","JSON","stringify","removeRtdRequest","settle","key","undefined","timeoutId","clearTimeout","delete","requestAndWaitForRtd","options","resolveResult","rejectResult","result","Promise","resolve","reject","previousRequest","setTimeout","currentRequest","createTimeoutError","timeoutMs","set","publishTimestamp","acknowledgement","then","sendEvent","interactionId","eventMetaData","timeout","catch","payload","all","resolveFromRtdEvent","clearAllRtdRequests","Array","from","values","forEach","languageCode","info","SEND_EVENT","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","getRealTimeAssistance","trimmedContext","uuidv4","ADD_SUGGESTIONS_EXTRA_CONTEXT","GET_SUGGESTIONS","loggerContext","GET_REAL_TIME_ASSISTANCE","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED","suggestedResponses","enable","sendRealTimeAssistanceUserAction","adaptiveCardId","actionId","actionType","SEND_REAL_TIME_ASSISTANCE_USER_ACTION","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED","SUGGESTED_RESPONSES_USER_ACTION","userAction","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\nimport LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {AI_SUMMARY_ERROR_CODES, CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n RealTimeAssistanceParams,\n RealTimeAssistanceUserActionParams,\n RespondToWellnessBreakParams,\n WellnessBreakUserAction,\n WELLNESS_BREAK_USER_ACTIONS,\n GenericError,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport type {PendingRtdRequest, RtdRequestOptions} from './core/types';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\ntype WellnessBreakContextProvider = () => {\n isWellnessBreakEnabled: boolean;\n agentId?: string;\n agentSessionId?: string;\n};\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n /** @internal Current AI flags from the agent configuration. */\n public aiFeature: AIFeatureFlags;\n private pendingRtdRequests = new Map<string, PendingRtdRequest<unknown>>();\n private readonly wellnessContextProvider?: WellnessBreakContextProvider;\n\n private createWellnessError(reason: string): GenericError {\n const error = new Error(reason) as GenericError;\n error.details = {\n type: 'SDK_VALIDATION_ERROR',\n orgId: this.webex.credentials.getOrgId(),\n trackingId: '',\n data: {reason},\n };\n\n return error;\n }\n\n constructor(webex: WebexSDK, wellnessContextProvider?: WellnessBreakContextProvider) {\n this.webex = webex;\n this.wellnessContextProvider = wellnessContextProvider;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n /**\n * Validates a caller-supplied identifier (agentId/interactionId) before it is used to\n * construct a request. Accepts a non-empty alphanumeric identifier that may contain\n * hyphens or underscores.\n * @param value - the identifier to validate\n * @returns {boolean} true when the identifier is a non-empty, well-formed string\n * @private\n */\n private isValidTranscriptIdentifier(value: unknown): boolean {\n return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);\n }\n\n private async sendWellnessBreakAction(\n action: WellnessBreakUserAction,\n method: string\n ): Promise<void> {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n ]);\n\n try {\n const context = this.wellnessContextProvider?.();\n const agentId = context?.agentId?.trim();\n const agentSessionId = context?.agentSessionId?.trim();\n const orgId = this.webex.credentials.getOrgId()?.trim();\n\n if (context?.isWellnessBreakEnabled !== true) {\n throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');\n }\n if (!orgId) {\n throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');\n }\n if (!agentId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');\n }\n if (!agentSessionId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');\n }\n\n const baseUrl = this.getBaseUrl();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType: AIAssistantEventType.CUSTOM_EVENT,\n eventName: AIAssistantEventName.WELLNESS_BREAK_ACTION,\n eventDetails: {\n data: {\n action,\n agentSessionId,\n actionTimeStamp: Date.now(),\n },\n },\n },\n })) as IHttpResponse;\n\n if (response.statusCode !== 202) {\n throw this.createWellnessError(\n `WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`\n );\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n {action},\n ['operational']\n );\n LoggerProxy.log('Wellness action accepted by AI Assistant', {\n module: CC_FILE,\n method,\n data: {action},\n });\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n {\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n const {error: detailedError} = getErrorDetails(error, method, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests an Agent Wellness Break.\n * The promise resolves when the HTTP request is accepted with status 202; the later\n * approval or denial is delivered independently through a wellness notification.\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.requestWellnessBreak();\n * @public\n */\n public async requestWellnessBreak(): Promise<void> {\n return this.sendWellnessBreakAction(\n WELLNESS_BREAK_USER_ACTIONS.REQUESTED,\n METHODS.REQUEST_WELLNESS_BREAK\n );\n }\n\n /**\n * Responds to a backend-provided Agent Wellness Break offer.\n * The promise resolves when the HTTP request is accepted with status 202 and does not\n * wait for a WebSocket completion event.\n * @param params - ACCEPTED, REJECTED, or NO_RESPONSE\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.respondToWellnessBreak({\n * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n * });\n * @public\n */\n public async respondToWellnessBreak(params: RespondToWellnessBreakParams): Promise<void> {\n const {action} = params;\n if (\n ![\n WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n WELLNESS_BREAK_USER_ACTIONS.REJECTED,\n WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE,\n ].includes(action)\n ) {\n const {error} = getErrorDetails(\n this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'),\n METHODS.RESPOND_TO_WELLNESS_BREAK,\n CC_FILE\n );\n throw error;\n }\n\n return this.sendWellnessBreakAction(action, METHODS.RESPOND_TO_WELLNESS_BREAK);\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n private static getRtdRequestKey(rtdEventType: string, correlationId: string): string {\n return JSON.stringify([rtdEventType, correlationId]);\n }\n\n private removeRtdRequest<T>(\n rtdEventType: string,\n correlationId: string,\n settle?: (request: PendingRtdRequest<T>) => void\n ): PendingRtdRequest<T> | undefined {\n const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);\n const request = this.pendingRtdRequests.get(key) as PendingRtdRequest<T> | undefined;\n\n if (!request) {\n return undefined;\n }\n\n if (request.timeoutId) {\n clearTimeout(request.timeoutId);\n }\n\n settle?.(request);\n this.pendingRtdRequests.delete(key);\n\n return request;\n }\n\n /** Sends an AI event and waits for its matching RTD response. @internal */\n public async requestAndWaitForRtd<T>(options: RtdRequestOptions): Promise<T> {\n const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);\n let resolveResult: (payload: T) => void = () => undefined;\n let rejectResult: (error: Error) => void = () => undefined;\n const result = new Promise<T>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n const previousRequest = this.pendingRtdRequests.get(key);\n if (previousRequest?.timeoutId) {\n clearTimeout(previousRequest.timeoutId);\n }\n const request: PendingRtdRequest<T> = {\n correlationId: options.correlationId,\n rtdEventType: options.rtdEventType,\n resolve: resolveResult,\n reject: rejectResult,\n };\n\n request.timeoutId = setTimeout(() => {\n this.removeRtdRequest<T>(options.rtdEventType, options.correlationId, (currentRequest) => {\n currentRequest.reject(options.createTimeoutError());\n });\n }, options.timeoutMs);\n this.pendingRtdRequests.set(key, request as PendingRtdRequest<unknown>);\n const publishTimestamp = options.publishTimestamp ?? Date.now();\n const acknowledgement = Promise.resolve()\n .then(() =>\n this.sendEvent(\n options.agentId,\n options.interactionId,\n options.eventType,\n options.eventName,\n options.eventMetaData,\n undefined,\n undefined,\n publishTimestamp,\n options.timeout\n )\n )\n .catch((error) => {\n this.removeRtdRequest(options.rtdEventType, options.correlationId);\n throw error;\n });\n\n const [payload] = await Promise.all([result, acknowledgement]);\n\n return payload;\n }\n\n /** Resolves a pending request from a parsed RTD event. @internal */\n public resolveFromRtdEvent<T>(\n rtdEventType: string,\n correlationId: string,\n payload: T\n ): 'resolved' | 'not-found' {\n const request = this.removeRtdRequest<T>(rtdEventType, correlationId, (currentRequest) => {\n currentRequest.resolve(payload);\n });\n\n return request ? 'resolved' : 'not-found';\n }\n\n /** Clears pending RTD requests when the RTD lifecycle ends. @internal */\n public clearAllRtdRequests(): void {\n Array.from(this.pendingRtdRequests.values()).forEach((request) => {\n this.removeRtdRequest(request.rtdEventType, request.correlationId, (currentRequest) => {\n currentRequest.reject(new Error('RTD request cleared'));\n });\n });\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param eventMetaData - event-specific fields to include in eventDetails.data\n * @param languageCode - language code within eventDetails.data\n * @param trackingId - tracking identifier within eventDetails.data\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n eventMetaData?: Record<string, unknown>,\n languageCode?: string,\n trackingId?: string,\n publishTimestamp?: number,\n timeout?: number\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, eventMetaData},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const data = {\n ...eventMetaData,\n interactionId,\n actionTimeStamp: String(Date.now()),\n languageCode,\n trackingId,\n };\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n ...(timeout !== undefined ? {timeout} : {}),\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n ...(publishTimestamp !== undefined ? {publishTimestamp} : {}),\n eventDetails: {\n data,\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests real-time assistance for an interaction.\n *\n * @param params - Real-time assistance request parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async getRealTimeAssistance(params: RealTimeAssistanceParams) {\n const {agentId, interactionId, context} = params;\n const trimmedContext = context?.trim();\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n const eventName = trimmedContext\n ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT\n : AIAssistantEventName.GET_SUGGESTIONS;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.GET_REAL_TIME_ASSISTANCE,\n interactionId,\n trackingId,\n data: {eventName},\n };\n\n LoggerProxy.info('Requesting real-time assistance', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n eventName,\n trimmedContext !== undefined ? {context: trimmedContext} : undefined,\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n eventName,\n trackingId,\n context,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance request succeeded', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance request failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n {\n agentId,\n interactionId,\n trackingId,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Sends user action feedback for a real-time assistance adaptive card.\n *\n * @param params - Real-time assistance user action parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async sendRealTimeAssistanceUserAction(\n params: RealTimeAssistanceUserActionParams\n ): Promise<Record<string, unknown>> {\n const {agentId, interactionId, adaptiveCardId, actionId} = params;\n const actionType = 'Action.Submit';\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n interactionId,\n trackingId,\n data: {actionId, adaptiveCardId},\n };\n\n LoggerProxy.info('Sending real-time assistance user action', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION,\n {\n adaptiveCardId,\n userAction: {\n actionType,\n actionId,\n },\n },\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance user action sent', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance user action failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n {\n agentId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n if (\n !this.isValidTranscriptIdentifier(agentId) ||\n !this.isValidTranscriptIdentifier(interactionId)\n ) {\n const {error: detailedError} = getErrorDetails(\n new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,eAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,MAAA,GAAAN,OAAA;AAcA,IAAAO,MAAA,GAAAP,OAAA;AAEA,IAAAQ,WAAA,GAAAR,OAAA;AAKqB,SAAAE,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AASrB;AACA;AACA;AACA;AACO,MAAMG,cAAc,CAAC;EAG1B;;EAEQC,kBAAkB,GAAG,IAAIC,GAAG,CAAqC,CAAC;EAGlEC,mBAAmBA,CAACC,MAAc,EAAgB;IACxD,MAAMC,KAAK,GAAG,IAAIC,KAAK,CAACF,MAAM,CAAiB;IAC/CC,KAAK,CAACE,OAAO,GAAG;MACdC,IAAI,EAAE,sBAAsB;MAC5BC,KAAK,EAAE,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC;MACxCC,UAAU,EAAE,EAAE;MACdC,IAAI,EAAE;QAACV;MAAM;IACf,CAAC;IAED,OAAOC,KAAK;EACd;EAEAU,WAAWA,CAACL,KAAe,EAAEM,uBAAsD,EAAE;IACnF,IAAI,CAACN,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACM,uBAAuB,GAAGA,uBAAuB;IACtD,IAAI,CAACC,cAAc,GAAGC,uBAAc,CAACC,WAAW,CAAC;MAACT;IAAK,CAAC,CAAC;EAC3D;EAEOU,iBAAiBA,CAACC,SAAyB,EAAQ;IACxD,IAAI,CAACA,SAAS,GAAGA,SAAS;EAC5B;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACUC,2BAA2BA,CAACC,KAAc,EAAW;IAC3D,OAAO,OAAOA,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAACC,IAAI,CAACD,KAAK,CAAC;EAC1E;EAEA,MAAcE,uBAAuBA,CACnCC,MAA+B,EAC/BC,MAAc,EACC;IACf,IAAI,CAACV,cAAc,CAACW,SAAS,CAAC,CAC5BC,6BAAkB,CAACC,qCAAqC,EACxDD,6BAAkB,CAACE,mCAAmC,CACvD,CAAC;IAEF,IAAI;MACF,MAAMC,OAAO,GAAG,IAAI,CAAChB,uBAAuB,GAAG,CAAC;MAChD,MAAMiB,OAAO,GAAGD,OAAO,EAAEC,OAAO,EAAEC,IAAI,CAAC,CAAC;MACxC,MAAMC,cAAc,GAAGH,OAAO,EAAEG,cAAc,EAAED,IAAI,CAAC,CAAC;MACtD,MAAMzB,KAAK,GAAG,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC,EAAEsB,IAAI,CAAC,CAAC;MAEvD,IAAIF,OAAO,EAAEI,sBAAsB,KAAK,IAAI,EAAE;QAC5C,MAAM,IAAI,CAACjC,mBAAmB,CAAC,4BAA4B,CAAC;MAC9D;MACA,IAAI,CAACM,KAAK,EAAE;QACV,MAAM,IAAI,CAACN,mBAAmB,CAAC,gCAAgC,CAAC;MAClE;MACA,IAAI,CAAC8B,OAAO,EAAE;QACZ,MAAM,IAAI,CAAC9B,mBAAmB,CAAC,kCAAkC,CAAC;MACpE;MACA,IAAI,CAACgC,cAAc,EAAE;QACnB,MAAM,IAAI,CAAChC,mBAAmB,CAAC,uCAAuC,CAAC;MACzE;MAEA,MAAMkC,OAAO,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;MACjC,MAAMC,QAAQ,GAAI,MAAM,IAAI,CAAC7B,KAAK,CAAC8B,OAAO,CAAC;QACzCC,GAAG,EAAE,GAAGJ,OAAO,GAAGK,iCAAqB,CAACC,KAAK,EAAE;QAC/ChB,MAAM,EAAEiB,mBAAY,CAACC,IAAI;QACzBC,aAAa,EAAE,IAAI;QACnBC,IAAI,EAAE;UACJd,OAAO;UACPxB,KAAK;UACLuC,SAAS,EAAEC,2BAAoB,CAACC,YAAY;UAC5CC,SAAS,EAAEC,2BAAoB,CAACC,qBAAqB;UACrDC,YAAY,EAAE;YACZxC,IAAI,EAAE;cACJY,MAAM;cACNS,cAAc;cACdoB,eAAe,EAAEC,IAAI,CAACC,GAAG,CAAC;YAC5B;UACF;QACF;MACF,CAAC,CAAmB;MAEpB,IAAIlB,QAAQ,CAACmB,UAAU,KAAK,GAAG,EAAE;QAC/B,MAAM,IAAI,CAACvD,mBAAmB,CAC5B,2CAA2CoC,QAAQ,CAACmB,UAAU,EAChE,CAAC;MACH;MAEA,IAAI,CAACzC,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACC,qCAAqC,EACxD;QAACJ;MAAM,CAAC,EACR,CAAC,aAAa,CAChB,CAAC;MACDkC,oBAAW,CAACC,GAAG,CAAC,0CAA0C,EAAE;QAC1DC,MAAM,EAAEC,mBAAO;QACfpC,MAAM;QACNb,IAAI,EAAE;UAACY;QAAM;MACf,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOrB,KAAK,EAAE;MACd,IAAI,CAACY,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACE,mCAAmC,EACtD;QACEL,MAAM;QACNrB,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAAC2D,OAAO,GAAGC,MAAM,CAAC5D,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MACD,MAAM;QAACA,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAAC9D,KAAK,EAAEsB,MAAM,EAAEoC,mBAAO,CAAC;MACtE,MAAMG,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaE,oBAAoBA,CAAA,EAAkB;IACjD,OAAO,IAAI,CAAC3C,uBAAuB,CACjC4C,kCAA2B,CAACC,SAAS,EACrCC,mBAAO,CAACC,sBACV,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaC,sBAAsBA,CAACC,MAAoC,EAAiB;IACvF,MAAM;MAAChD;IAAM,CAAC,GAAGgD,MAAM;IACvB,IACE,CAAC,CACCL,kCAA2B,CAACM,QAAQ,EACpCN,kCAA2B,CAACO,QAAQ,EACpCP,kCAA2B,CAACQ,WAAW,CACxC,CAACC,QAAQ,CAACpD,MAAM,CAAC,EAClB;MACA,MAAM;QAACrB;MAAK,CAAC,GAAG,IAAA8D,sBAAe,EAC7B,IAAI,CAAChE,mBAAmB,CAAC,+BAA+B,CAAC,EACzDoE,mBAAO,CAACQ,yBAAyB,EACjChB,mBACF,CAAC;MACD,MAAM1D,KAAK;IACb;IAEA,OAAO,IAAI,CAACoB,uBAAuB,CAACC,MAAM,EAAE6C,mBAAO,CAACQ,yBAAyB,CAAC;EAChF;EAEQzC,UAAUA,CAAA,EAAW;IAC3B,MAAM0C,gBAAgB,GAAG,IAAI,CAACtE,KAAK,CAACuE,QAAQ,CAACC,QAAQ,CAACC,GAAG,CAACC,2BAAe,CAAC,IAAI,EAAE;IAEhF,IAAI,CAACJ,gBAAgB,EAAE;MACrB,MAAM;QAAC3E,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC+E,kCAAsB,CAACC,mCAAmC,CAAC,EACrEf,mBAAO,CAACgB,YAAY,EACpBxB,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;IAEA,IAAIsB,QAAQ,GAAG,EAAE;IACjB,IAAI;MACFA,QAAQ,GAAG,IAAIC,GAAG,CAACT,gBAAgB,CAAC,CAACQ,QAAQ,CAACE,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,OAAOrF,KAAK,EAAE;MACdmF,QAAQ,GAAGR,gBAAgB,CAACU,WAAW,CAAC,CAAC;IAC3C;IAEA,MAAMC,WAAW,GAAGC,gCAAoB,CAACJ,QAAQ,CAAC;IAElD,IAAI,CAACG,WAAW,EAAE;MAChB,MAAM;QAACtF,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC+E,kCAAsB,CAACC,mCAAmC,CAAC,EACrEf,mBAAO,CAACgB,YAAY,EACpBxB,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;IAEA,OAAO2B,0CAA8B,CAACC,OAAO,CAAC,IAAI,EAAEH,WAAW,CAAC;EAClE;EAEA,OAAeI,gBAAgBA,CAACC,YAAoB,EAAEC,aAAqB,EAAU;IACnF,OAAOC,IAAI,CAACC,SAAS,CAAC,CAACH,YAAY,EAAEC,aAAa,CAAC,CAAC;EACtD;EAEQG,gBAAgBA,CACtBJ,YAAoB,EACpBC,aAAqB,EACrBI,MAAgD,EACd;IAClC,MAAMC,GAAG,GAAGtG,cAAc,CAAC+F,gBAAgB,CAACC,YAAY,EAAEC,aAAa,CAAC;IACxE,MAAMzD,OAAO,GAAG,IAAI,CAACvC,kBAAkB,CAACkF,GAAG,CAACmB,GAAG,CAAqC;IAEpF,IAAI,CAAC9D,OAAO,EAAE;MACZ,OAAO+D,SAAS;IAClB;IAEA,IAAI/D,OAAO,CAACgE,SAAS,EAAE;MACrBC,YAAY,CAACjE,OAAO,CAACgE,SAAS,CAAC;IACjC;IAEAH,MAAM,GAAG7D,OAAO,CAAC;IACjB,IAAI,CAACvC,kBAAkB,CAACyG,MAAM,CAACJ,GAAG,CAAC;IAEnC,OAAO9D,OAAO;EAChB;;EAEA;EACA,MAAamE,oBAAoBA,CAAIC,OAA0B,EAAc;IAC3E,MAAMN,GAAG,GAAGtG,cAAc,CAAC+F,gBAAgB,CAACa,OAAO,CAACZ,YAAY,EAAEY,OAAO,CAACX,aAAa,CAAC;IACxF,IAAIY,aAAmC,GAAGA,CAAA,KAAMN,SAAS;IACzD,IAAIO,YAAoC,GAAGA,CAAA,KAAMP,SAAS;IAC1D,MAAMQ,MAAM,GAAG,IAAIC,OAAO,CAAI,CAACC,OAAO,EAAEC,MAAM,KAAK;MACjDL,aAAa,GAAGI,OAAO;MACvBH,YAAY,GAAGI,MAAM;IACvB,CAAC,CAAC;IACF,MAAMC,eAAe,GAAG,IAAI,CAAClH,kBAAkB,CAACkF,GAAG,CAACmB,GAAG,CAAC;IACxD,IAAIa,eAAe,EAAEX,SAAS,EAAE;MAC9BC,YAAY,CAACU,eAAe,CAACX,SAAS,CAAC;IACzC;IACA,MAAMhE,OAA6B,GAAG;MACpCyD,aAAa,EAAEW,OAAO,CAACX,aAAa;MACpCD,YAAY,EAAEY,OAAO,CAACZ,YAAY;MAClCiB,OAAO,EAAEJ,aAAa;MACtBK,MAAM,EAAEJ;IACV,CAAC;IAEDtE,OAAO,CAACgE,SAAS,GAAGY,UAAU,CAAC,MAAM;MACnC,IAAI,CAAChB,gBAAgB,CAAIQ,OAAO,CAACZ,YAAY,EAAEY,OAAO,CAACX,aAAa,EAAGoB,cAAc,IAAK;QACxFA,cAAc,CAACH,MAAM,CAACN,OAAO,CAACU,kBAAkB,CAAC,CAAC,CAAC;MACrD,CAAC,CAAC;IACJ,CAAC,EAAEV,OAAO,CAACW,SAAS,CAAC;IACrB,IAAI,CAACtH,kBAAkB,CAACuH,GAAG,CAAClB,GAAG,EAAE9D,OAAqC,CAAC;IACvE,MAAMiF,gBAAgB,GAAGb,OAAO,CAACa,gBAAgB,IAAIjE,IAAI,CAACC,GAAG,CAAC,CAAC;IAC/D,MAAMiE,eAAe,GAAGV,OAAO,CAACC,OAAO,CAAC,CAAC,CACtCU,IAAI,CAAC,MACJ,IAAI,CAACC,SAAS,CACZhB,OAAO,CAAC3E,OAAO,EACf2E,OAAO,CAACiB,aAAa,EACrBjB,OAAO,CAAC5D,SAAS,EACjB4D,OAAO,CAACzD,SAAS,EACjByD,OAAO,CAACkB,aAAa,EACrBvB,SAAS,EACTA,SAAS,EACTkB,gBAAgB,EAChBb,OAAO,CAACmB,OACV,CACF,CAAC,CACAC,KAAK,CAAE3H,KAAK,IAAK;MAChB,IAAI,CAAC+F,gBAAgB,CAACQ,OAAO,CAACZ,YAAY,EAAEY,OAAO,CAACX,aAAa,CAAC;MAClE,MAAM5F,KAAK;IACb,CAAC,CAAC;IAEJ,MAAM,CAAC4H,OAAO,CAAC,GAAG,MAAMjB,OAAO,CAACkB,GAAG,CAAC,CAACnB,MAAM,EAAEW,eAAe,CAAC,CAAC;IAE9D,OAAOO,OAAO;EAChB;;EAEA;EACOE,mBAAmBA,CACxBnC,YAAoB,EACpBC,aAAqB,EACrBgC,OAAU,EACgB;IAC1B,MAAMzF,OAAO,GAAG,IAAI,CAAC4D,gBAAgB,CAAIJ,YAAY,EAAEC,aAAa,EAAGoB,cAAc,IAAK;MACxFA,cAAc,CAACJ,OAAO,CAACgB,OAAO,CAAC;IACjC,CAAC,CAAC;IAEF,OAAOzF,OAAO,GAAG,UAAU,GAAG,WAAW;EAC3C;;EAEA;EACO4F,mBAAmBA,CAAA,EAAS;IACjCC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACrI,kBAAkB,CAACsI,MAAM,CAAC,CAAC,CAAC,CAACC,OAAO,CAAEhG,OAAO,IAAK;MAChE,IAAI,CAAC4D,gBAAgB,CAAC5D,OAAO,CAACwD,YAAY,EAAExD,OAAO,CAACyD,aAAa,EAAGoB,cAAc,IAAK;QACrFA,cAAc,CAACH,MAAM,CAAC,IAAI5G,KAAK,CAAC,qBAAqB,CAAC,CAAC;MACzD,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAasH,SAASA,CACpB3F,OAAe,EACf4F,aAAqB,EACrB7E,SAA+B,EAC/BG,SAA+B,EAC/B2E,aAAuC,EACvCW,YAAqB,EACrB5H,UAAmB,EACnB4G,gBAAyB,EACzBM,OAAgB,EACkB;IAClCnE,oBAAW,CAAC8E,IAAI,CAAC,eAAe,EAAE;MAChC5E,MAAM,EAAEC,mBAAO;MACfpC,MAAM,EAAE4C,mBAAO,CAACoE,UAAU;MAC1Bd,aAAa;MACb/G,IAAI,EAAE;QAACkC,SAAS;QAAEG,SAAS;QAAE2E;MAAa;IAC5C,CAAC,CAAC;IACF,IAAI,CAAC7G,cAAc,CAACW,SAAS,CAAC,CAC5BC,6BAAkB,CAAC+G,+BAA+B,EAClD/G,6BAAkB,CAACgH,8BAA8B,CAClD,CAAC;IAEF,IAAI;MACF,MAAMxG,OAAO,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;MACjC,MAAM7B,KAAK,GAAG,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC;MAC/C,MAAME,IAAI,GAAG;QACX,GAAGgH,aAAa;QAChBD,aAAa;QACbtE,eAAe,EAAEU,MAAM,CAACT,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC;QACnCgF,YAAY;QACZ5H;MACF,CAAC;MACD,MAAM0B,QAAQ,GAAI,MAAM,IAAI,CAAC7B,KAAK,CAAC8B,OAAO,CAAC;QACzCC,GAAG,EAAE,GAAGJ,OAAO,GAAGK,iCAAqB,CAACC,KAAK,EAAE;QAC/ChB,MAAM,EAAEiB,mBAAY,CAACC,IAAI;QACzBC,aAAa,EAAE,IAAI;QACnB,IAAIiF,OAAO,KAAKxB,SAAS,GAAG;UAACwB;QAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3ChF,IAAI,EAAE;UACJd,OAAO;UACPxB,KAAK;UACLuC,SAAS;UACTG,SAAS;UACT,IAAIsE,gBAAgB,KAAKlB,SAAS,GAAG;YAACkB;UAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;UAC7DnE,YAAY,EAAE;YACZxC;UACF;QACF;MACF,CAAC,CAAmB;MAEpB,IAAI,CAACG,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAAC+G,+BAA+B,EAClD;QAAC3G,OAAO;QAAExB,KAAK;QAAEoH,aAAa;QAAE7E,SAAS;QAAEG;MAAS,CAAC,EACrD,CAAC,aAAa,CAChB,CAAC;MAED,OAAOZ,QAAQ,EAAEQ,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,OAAO1C,KAAK,EAAE;MACd,IAAI,CAACY,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACgH,8BAA8B,EACjD;QACEhB,aAAa;QACb7E,SAAS;QACTG,SAAS;QACT9C,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAAC2D,OAAO,GAAGC,MAAM,CAAC5D,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MAED,MAAM;QAACA,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAAC9D,KAAK,EAAEkE,mBAAO,CAACoE,UAAU,EAAE5E,mBAAO,CAAC;MAClF,MAAMG,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAa4E,qBAAqBA,CAACpE,MAAgC,EAAE;IACnE,MAAM;MAACzC,OAAO;MAAE4F,aAAa;MAAE7F;IAAO,CAAC,GAAG0C,MAAM;IAChD,MAAMqE,cAAc,GAAG/G,OAAO,EAAEE,IAAI,CAAC,CAAC;IACtC,MAAMuG,YAAY,GAAG/D,MAAM,CAAC+D,YAAY,IAAI,IAAI;IAChD,MAAM5H,UAAU,GAAG,aAAa,IAAAmI,QAAM,EAAC,CAAC,EAAE;IAC1C,MAAM7F,SAAS,GAAG4F,cAAc,GAC5B3F,2BAAoB,CAAC6F,6BAA6B,GAClD7F,2BAAoB,CAAC8F,eAAe;IAExC,MAAMC,aAAa,GAAG;MACpBrF,MAAM,EAAEC,mBAAO;MACfpC,MAAM,EAAE4C,mBAAO,CAAC6E,wBAAwB;MACxCvB,aAAa;MACbhH,UAAU;MACVC,IAAI,EAAE;QAACqC;MAAS;IAClB,CAAC;IAEDS,oBAAW,CAAC8E,IAAI,CAAC,iCAAiC,EAAES,aAAa,CAAC;IAElE,IAAI,CAAClI,cAAc,CAACW,SAAS,CAAC,CAC5BC,6BAAkB,CAACwH,6CAA6C,EAChExH,6BAAkB,CAACyH,4CAA4C,CAChE,CAAC;IAEF,IAAI;MACF,IAAI,CAAC,IAAI,CAACjI,SAAS,EAAEkI,kBAAkB,EAAEC,MAAM,EAAE;QAC/C,MAAM;UAACnJ,KAAK,EAAE6D;QAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC,iCAAiC,CAAC,EAC5CiE,mBAAO,CAAC6E,wBAAwB,EAChCrF,mBACF,CAAC;QACD,MAAMG,aAAa;MACrB;MAEA,MAAMzD,KAAK,GAAG,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC;MAE/C,MAAM2B,QAAQ,GAAG,MAAM,IAAI,CAACqF,SAAS,CACnC3F,OAAO,EACP4F,aAAa,EACb5E,2BAAoB,CAACC,YAAY,EACjCC,SAAS,EACT4F,cAAc,KAAKxC,SAAS,GAAG;QAACvE,OAAO,EAAE+G;MAAc,CAAC,GAAGxC,SAAS,EACpEkC,YAAY,EACZ5H,UACF,CAAC;MAED,IAAI,CAACI,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACwH,6CAA6C,EAChE;QACEpH,OAAO;QACPxB,KAAK;QACLoH,aAAa;QACb1E,SAAS;QACTtC,UAAU;QACVmB;MACF,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MACD4B,oBAAW,CAACC,GAAG,CAAC,wCAAwC,EAAEsF,aAAa,CAAC;MAExE,OAAO5G,QAAQ;IACjB,CAAC,CAAC,OAAOlC,KAAK,EAAE;MACduD,oBAAW,CAACvD,KAAK,CAAC,qCAAqC,EAAE;QAAC,GAAG8I,aAAa;QAAE9I;MAAK,CAAC,CAAC;MACnF,IAAI,CAACY,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACyH,4CAA4C,EAC/D;QACErH,OAAO;QACP4F,aAAa;QACbhH,UAAU;QACVsC,SAAS;QACT9C,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAAC2D,OAAO,GAAGC,MAAM,CAAC5D,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MAED,MAAM;QAACA,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C9D,KAAK,EACLkE,mBAAO,CAAC6E,wBAAwB,EAChCrF,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,MAAauF,gCAAgCA,CAC3C/E,MAA0C,EACR;IAClC,MAAM;MAACzC,OAAO;MAAE4F,aAAa;MAAE6B,cAAc;MAAEC;IAAQ,CAAC,GAAGjF,MAAM;IACjE,MAAMkF,UAAU,GAAG,eAAe;IAClC,MAAMnB,YAAY,GAAG/D,MAAM,CAAC+D,YAAY,IAAI,IAAI;IAChD,MAAM5H,UAAU,GAAG,aAAa,IAAAmI,QAAM,EAAC,CAAC,EAAE;IAE1C,MAAMG,aAAa,GAAG;MACpBrF,MAAM,EAAEC,mBAAO;MACfpC,MAAM,EAAE4C,mBAAO,CAACsF,qCAAqC;MACrDhC,aAAa;MACbhH,UAAU;MACVC,IAAI,EAAE;QAAC6I,QAAQ;QAAED;MAAc;IACjC,CAAC;IAED9F,oBAAW,CAAC8E,IAAI,CAAC,0CAA0C,EAAES,aAAa,CAAC;IAE3E,IAAI,CAAClI,cAAc,CAACW,SAAS,CAAC,CAC5BC,6BAAkB,CAACiI,0DAA0D,EAC7EjI,6BAAkB,CAACkI,yDAAyD,CAC7E,CAAC;IAEF,IAAI;MACF,IAAI,CAAC,IAAI,CAAC1I,SAAS,EAAEkI,kBAAkB,EAAEC,MAAM,EAAE;QAC/C,MAAM;UAACnJ,KAAK,EAAE6D;QAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC,iCAAiC,CAAC,EAC5CiE,mBAAO,CAACsF,qCAAqC,EAC7C9F,mBACF,CAAC;QACD,MAAMG,aAAa;MACrB;MAEA,MAAMzD,KAAK,GAAG,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC;MAC/C,MAAM2B,QAAQ,GAAG,MAAM,IAAI,CAACqF,SAAS,CACnC3F,OAAO,EACP4F,aAAa,EACb5E,2BAAoB,CAACC,YAAY,EACjCE,2BAAoB,CAAC4G,+BAA+B,EACpD;QACEN,cAAc;QACdO,UAAU,EAAE;UACVL,UAAU;UACVD;QACF;MACF,CAAC,EACDlB,YAAY,EACZ5H,UACF,CAAC;MAED,IAAI,CAACI,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACiI,0DAA0D,EAC7E;QACE7H,OAAO;QACPxB,KAAK;QACLoH,aAAa;QACb6B,cAAc;QACdC,QAAQ;QACR9I;MACF,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MACD+C,oBAAW,CAACC,GAAG,CAAC,uCAAuC,EAAEsF,aAAa,CAAC;MAEvE,OAAO5G,QAAQ;IACjB,CAAC,CAAC,OAAOlC,KAAK,EAAE;MACduD,oBAAW,CAACvD,KAAK,CAAC,yCAAyC,EAAE;QAAC,GAAG8I,aAAa;QAAE9I;MAAK,CAAC,CAAC;MACvF,IAAI,CAACY,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACkI,yDAAyD,EAC5E;QACE9H,OAAO;QACP4F,aAAa;QACb6B,cAAc;QACdC,QAAQ;QACR9I,UAAU;QACVR,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAAC2D,OAAO,GAAGC,MAAM,CAAC5D,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MAED,MAAM;QAACA,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C9D,KAAK,EACLkE,mBAAO,CAACsF,qCAAqC,EAC7C9F,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,MAAagG,wBAAwBA,CACnCjI,OAAe,EACf4F,aAAqB,EACiB;IACtCjE,oBAAW,CAAC8E,IAAI,CAAC,+BAA+B,EAAE;MAChD5E,MAAM,EAAEC,mBAAO;MACfpC,MAAM,EAAE4C,mBAAO,CAAC4F,0BAA0B;MAC1CtC;IACF,CAAC,CAAC;IACF,IAAI,CAAC5G,cAAc,CAACW,SAAS,CAAC,CAC5BC,6BAAkB,CAACuI,+CAA+C,EAClEvI,6BAAkB,CAACwI,8CAA8C,CAClE,CAAC;IACF,IAAI,CAAC,IAAI,CAAChJ,SAAS,EAAEiJ,mBAAmB,EAAEd,MAAM,EAAE;MAChD,MAAM;QAACnJ,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC,qCAAqC,CAAC,EAChDiE,mBAAO,CAAC4F,0BAA0B,EAClCpG,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;IAEA,IACE,CAAC,IAAI,CAAC5C,2BAA2B,CAACW,OAAO,CAAC,IAC1C,CAAC,IAAI,CAACX,2BAA2B,CAACuG,aAAa,CAAC,EAChD;MACA,MAAM;QAACxH,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C,IAAI7D,KAAK,CAAC,oCAAoC,CAAC,EAC/CiE,mBAAO,CAAC4F,0BAA0B,EAClCpG,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;IAEA,IAAI;MACF,MAAM7B,OAAO,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;MACjC,MAAM7B,KAAK,GAAG,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,QAAQ,CAAC,CAAC;MAC/C,MAAM2B,QAAQ,GAAI,MAAM,IAAI,CAAC7B,KAAK,CAAC8B,OAAO,CAAC;QACzCC,GAAG,EAAE,GAAGJ,OAAO,GAAGK,iCAAqB,CAAC6H,gBAAgB,EAAE;QAC1D5I,MAAM,EAAEiB,mBAAY,CAACC,IAAI;QACzBC,aAAa,EAAE,IAAI;QACnBC,IAAI,EAAE;UACJd,OAAO;UACPxB,KAAK;UACLoH;QACF;MACF,CAAC,CAAmB;MAEpB,IAAI,CAAC5G,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACuI,+CAA+C,EAClE;QAACnI,OAAO;QAAExB,KAAK;QAAEoH;MAAa,CAAC,EAC/B,CAAC,aAAa,CAChB,CAAC;MAED,OAAOtF,QAAQ,CAACQ,IAAI;IACtB,CAAC,CAAC,OAAO1C,KAAK,EAAE;MACd,IAAI,CAACY,cAAc,CAAC0C,UAAU,CAC5B9B,6BAAkB,CAACwI,8CAA8C,EACjE;QACExC,aAAa;QACbxH,KAAK,EAAEA,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAAC2D,OAAO,GAAGC,MAAM,CAAC5D,KAAK;MAC9D,CAAC,EACD,CAAC,aAAa,CAChB,CAAC;MAED,IAAIA,KAAK,YAAYC,KAAK,EAAE;QAC1B,MAAMD,KAAK;MACb;MACA,MAAM;QAACA,KAAK,EAAE6D;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAC5C9D,KAAK,EACLkE,mBAAO,CAAC4F,0BAA0B,EAClCpG,mBACF,CAAC;MACD,MAAMG,aAAa;IACrB;EACF;AACF;AAACsG,OAAA,CAAAxK,cAAA,GAAAA,cAAA;AAAA,IAAAyK,QAAA,GAAAD,OAAA,CAAAzK,OAAA,GAEcC,cAAc","ignoreList":[]}
|