@webex/contact-center 3.12.0-next.13 → 3.12.0-next.130
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 +884 -0
- package/AGENTS.md +94 -0
- package/ai-docs/ARCHITECTURE.md +168 -0
- package/ai-docs/CONTRACTS.md +53 -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 +382 -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 +971 -42
- package/dist/cc.js.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +31 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js +45 -15
- 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 +205 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +48 -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 +269 -9
- 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/WebexCrossClientService.js +222 -0
- package/dist/services/WebexCrossClientService.js.map +1 -0
- package/dist/services/WxAppTelephonyMercurySync.js +108 -0
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
- package/dist/services/config/Util.js +11 -4
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +41 -7
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +51 -0
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +57 -12
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +111 -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 +28 -14
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/types.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +2 -1
- 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 +754 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +49 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +1172 -521
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +211 -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 +12 -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/dialer.js +78 -0
- package/dist/services/task/dialer.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 +228 -5
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1485 -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/wxAppVoiceMethods.js +354 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
- package/dist/services/wxAppDiagnosticLogging.js +122 -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 +193 -6
- package/dist/types/config.d.ts +13 -0
- package/dist/types/constants.d.ts +29 -1
- package/dist/types/index.d.ts +35 -8
- package/dist/types/metrics/MetricsManager.d.ts +6 -0
- package/dist/types/metrics/constants.d.ts +43 -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 +56 -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/constants.d.ts +34 -5
- package/dist/types/services/config/types.d.ts +197 -12
- package/dist/types/services/core/Err.d.ts +6 -0
- package/dist/types/services/core/Utils.d.ts +35 -13
- package/dist/types/services/core/WebexRequest.d.ts +1 -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 +175 -0
- package/dist/types/services/task/TaskFactory.d.ts +13 -0
- package/dist/types/services/task/TaskUtils.d.ts +48 -2
- package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
- package/dist/types/services/task/constants.d.ts +10 -0
- package/dist/types/services/task/contact.d.ts +4 -0
- package/dist/types/services/task/dialer.d.ts +30 -0
- package/dist/types/services/task/digital/Digital.d.ts +22 -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 +680 -66
- package/dist/types/services/task/voice/Voice.d.ts +227 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
- package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
- package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
- package/dist/types/types.d.ts +205 -9
- package/dist/types/utils/PageCache.d.ts +20 -3
- package/dist/types/webex.d.ts +1 -0
- package/dist/types.js +162 -4
- 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 +1289 -112
- package/src/config.ts +13 -0
- package/src/constants.ts +29 -1
- package/src/index.ts +36 -5
- 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 +921 -0
- package/src/metrics/behavioral-events.ts +212 -0
- package/src/metrics/constants.ts +52 -4
- package/src/services/AddressBook.ts +17 -6
- package/src/services/AnswerCallOnWebexService.ts +239 -0
- package/src/services/ApiAiAssistant.ts +356 -9
- package/src/services/EntryPoint.ts +59 -60
- package/src/services/Queue.ts +29 -12
- package/src/services/UserPreference.ts +509 -0
- package/src/services/WebexCrossClientService.ts +293 -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 +505 -0
- package/src/services/config/Util.ts +12 -3
- package/src/services/config/ai-docs/AGENTS.md +255 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
- package/src/services/config/ai-docs/config-spec.md +686 -0
- package/src/services/config/constants.ts +46 -6
- package/src/services/config/index.ts +65 -0
- package/src/services/config/types.ts +197 -13
- package/src/services/core/Err.ts +3 -0
- package/src/services/core/Utils.ts +127 -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 +787 -0
- package/src/services/core/aqm-reqs.ts +30 -15
- package/src/services/core/types.ts +2 -0
- package/src/services/core/websocket/WebSocketManager.ts +2 -0
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +1 -1
- package/src/services/task/Task.ts +908 -0
- package/src/services/task/TaskFactory.ts +60 -0
- package/src/services/task/TaskManager.ts +1419 -608
- package/src/services/task/TaskUtils.ts +303 -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 +1474 -0
- package/src/services/task/constants.ts +10 -0
- package/src/services/task/contact.ts +30 -0
- package/src/services/task/dialer.ts +80 -0
- package/src/services/task/digital/Digital.ts +97 -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 +819 -70
- package/src/services/task/voice/Voice.ts +1851 -0
- package/src/services/task/voice/WebRTC.ts +191 -0
- package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
- package/src/services/wxAppDiagnosticLogging.ts +174 -0
- package/src/services/wxAppTelephonyUtils.ts +14 -0
- package/src/types.ts +262 -11
- 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/spec/cc.ts +2210 -119
- 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 +311 -21
- 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 +7 -1
- package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
- package/test/unit/spec/services/config/Util.ts +129 -0
- package/test/unit/spec/services/config/index.ts +97 -29
- package/test/unit/spec/services/core/Utils.ts +425 -8
- package/test/unit/spec/services/core/WebexRequest.ts +3 -1
- package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +745 -0
- package/test/unit/spec/services/task/TaskFactory.ts +99 -0
- package/test/unit/spec/services/task/TaskManager.ts +2518 -1494
- package/test/unit/spec/services/task/TaskUtils.ts +235 -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/dialer.ts +190 -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 +2061 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
- package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
- package/test/unit/spec/wellnessSampleUtils.ts +288 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
- package/dist/services/task/index.js +0 -1525
- 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 -1801
- package/test/unit/spec/services/task/index.ts +0 -2184
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AddressBook","constructor","webex","getAddressBookId","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntries","params","startTime","Date","now","addressBookId","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","bookId","orgId","credentials","getOrgId","isSearchRequest","LoggerProxy","info","module","method","data","canUseCache","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","cacheHit","recordCount","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ADDRESSBOOK_FETCH_SUCCESS","errorData","error","trackEvent","ADDRESSBOOK_FETCH_FAILED","Error","queryParams","URLSearchParams","toString","append","resource","endPointMap","addressBookEntries","service","WCC_API_GATEWAY","response","request","HTTP_METHODS","GET","body","statusCode","isFirstPage","cachePage","message","String","exports","_default"],"sources":["AddressBook.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {\n AddressBookEntry,\n AddressBookEntriesResponse,\n AddressBookEntrySearchParams,\n} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * AddressBook API class for managing Webex Contact Center address book entries.\n * Provides functionality to fetch address book entries using the entry API.\n *\n * @class AddressBook\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get AddressBook API instance from ContactCenter\n * const addressBookAPI = cc.addressBook;\n *\n * // Get entries from agent's default address book\n * const entries = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const entries = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entries\n * const searchResults = await addressBook.getEntries({\n * search: 'john',\n * filter: 'name==\"John Doe\"'\n * });\n * ```\n */\nexport class AddressBook {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private getAddressBookId: () => string;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<AddressBookEntry>;\n\n /**\n * Creates an instance of AddressBook\n * @param {WebexSDK} webex - The Webex SDK instance\n * @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile\n * @public\n */\n constructor(webex: WebexSDK, getAddressBookId: () => string) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.getAddressBookId = getAddressBookId;\n this.pageCache = new PageCache<AddressBookEntry>('AddressBook');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches address book entries for a specific address book using the entry API\n * @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId\n * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get entries from agent's default address book\n * const response = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const response = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntries(\n params: AddressBookEntrySearchParams = {}\n ): Promise<AddressBookEntriesResponse> {\n const startTime = Date.now();\n const {\n addressBookId,\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n } = params;\n\n // Use provided addressBookId or fall back to agent's address book\n const bookId = addressBookId || this.getAddressBookId();\n const orgId = this.webex.credentials.getOrgId();\n const isSearchRequest = !!(search || filter || attributes);\n\n LoggerProxy.info('Fetching address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n orgId,\n bookId,\n page,\n pageSize,\n isSearchRequest,\n },\n });\n\n // Check if we can use cache for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes})) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.info(`Returning page ${page} from cache`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheHit: true,\n duration,\n recordCount: cachedPage.data.length,\n page,\n pageSize,\n },\n });\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing for the operation\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);\n\n // Validate address book id early to avoid bad requests\n if (!bookId) {\n const errorData = {\n orgId,\n bookId,\n isSearchRequest,\n page,\n pageSize,\n error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.',\n };\n LoggerProxy.error('AddressBook called without a valid addressBookId', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n });\n\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw new Error('AddressBook: addressBookId is not available for the current agent.');\n }\n\n try {\n // Build query parameters according to spec\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n });\n\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (search) queryParams.append('search', search);\n\n const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());\n\n LoggerProxy.info('Making API request to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n resource,\n service: WCC_API_GATEWAY,\n },\n });\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.info(`Successfully retrieved ${recordCount} address book entries`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS,\n {\n orgId,\n bookId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral', 'operational']\n );\n }\n\n // Cache the page data for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes}) && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.info('Cached address book entries for future requests', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheKey,\n recordCount,\n },\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n bookId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error('Failed to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default AddressBook;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AddressBook","constructor","webex","getAddressBookId","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntries","params","startTime","Date","now","addressBookId","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","sortBy","sortOrder","bookId","orgId","credentials","getOrgId","hasCustomSort","isSearchRequest","canUseCache","undefined","LoggerProxy","info","module","method","data","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","cacheHit","recordCount","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ADDRESSBOOK_FETCH_SUCCESS","errorData","error","trackEvent","ADDRESSBOOK_FETCH_FAILED","Error","queryParams","URLSearchParams","toString","append","toUpperCase","resource","endPointMap","addressBookEntries","service","WCC_API_GATEWAY","response","request","HTTP_METHODS","GET","body","statusCode","isFirstPage","cachePage","message","String","exports","_default"],"sources":["AddressBook.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {\n AddressBookEntry,\n AddressBookEntriesResponse,\n AddressBookEntrySearchParams,\n} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * AddressBook API class for managing Webex Contact Center address book entries.\n * Provides functionality to fetch address book entries using the entry API.\n *\n * @class AddressBook\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get AddressBook API instance from ContactCenter\n * const addressBookAPI = cc.addressBook;\n *\n * // Get entries from agent's default address book\n * const entries = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const entries = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entries\n * const searchResults = await addressBook.getEntries({\n * search: 'john',\n * filter: 'name==\"John Doe\"'\n * });\n * ```\n */\nexport class AddressBook {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private getAddressBookId: () => string;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<AddressBookEntry>;\n\n /**\n * Creates an instance of AddressBook\n * @param {WebexSDK} webex - The Webex SDK instance\n * @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile\n * @public\n */\n constructor(webex: WebexSDK, getAddressBookId: () => string) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.getAddressBookId = getAddressBookId;\n this.pageCache = new PageCache<AddressBookEntry>('AddressBook');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches address book entries for a specific address book using the entry API\n * @param {AddressBookEntrySearchParams} [params] - Search, pagination, and optional sort parameters\n * including addressBookId. Sorting defaults to name ascending.\n * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get entries from agent's default address book\n * const response = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const response = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntries(\n params: AddressBookEntrySearchParams = {}\n ): Promise<AddressBookEntriesResponse> {\n const startTime = Date.now();\n const {\n addressBookId,\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n sortBy = 'name',\n sortOrder = 'asc',\n } = params;\n\n // Use provided addressBookId or fall back to agent's address book\n const bookId = addressBookId || this.getAddressBookId();\n const orgId = this.webex.credentials.getOrgId();\n const hasCustomSort = sortBy !== 'name' || sortOrder !== 'asc';\n const isSearchRequest = !!(search || filter || attributes || hasCustomSort);\n const canUseCache = this.pageCache.canUseCache({\n search,\n filter,\n attributes,\n sortBy: hasCustomSort ? sortBy : undefined,\n });\n\n LoggerProxy.info('Fetching address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n orgId,\n bookId,\n page,\n pageSize,\n isSearchRequest,\n },\n });\n\n // Default name-ascending pagination is cache-compatible; result-changing overrides are not.\n if (canUseCache) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.info(`Returning page ${page} from cache`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheHit: true,\n duration,\n recordCount: cachedPage.data.length,\n page,\n pageSize,\n },\n });\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing for the operation\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);\n\n // Validate address book id early to avoid bad requests\n if (!bookId) {\n const errorData = {\n orgId,\n bookId,\n isSearchRequest,\n page,\n pageSize,\n error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.',\n };\n LoggerProxy.error('AddressBook called without a valid addressBookId', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n });\n\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw new Error('AddressBook: addressBookId is not available for the current agent.');\n }\n\n try {\n // Build query parameters according to spec\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n });\n\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (search) queryParams.append('search', search);\n if (sortBy) queryParams.append('sort', `${sortBy},${sortOrder.toUpperCase()}`);\n\n const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());\n\n LoggerProxy.info('Making API request to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n resource,\n service: WCC_API_GATEWAY,\n },\n });\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.info(`Successfully retrieved ${recordCount} address book entries`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS,\n {\n orgId,\n bookId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral', 'operational']\n );\n }\n\n // Cache only the invariant default-order pagination shape.\n if (canUseCache && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.info('Cached address book entries for future requests', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheKey,\n recordCount,\n },\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n bookId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error('Failed to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default AddressBook;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
|
|
8
|
+
var _constants = require("../constants");
|
|
9
|
+
var _types = require("../types");
|
|
10
|
+
var _Utils = require("./core/Utils");
|
|
11
|
+
var _wxAppTelephonyUtils = require("./wxAppTelephonyUtils");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const ANSWER_CALL_ON_WEBEX_FILE = 'AnswerCallOnWebexService';
|
|
14
|
+
const extractWxAppTrackingId = source => {
|
|
15
|
+
const sourceObj = source;
|
|
16
|
+
return sourceObj?.details?.trackingId || sourceObj?.trackingId;
|
|
17
|
+
};
|
|
18
|
+
const extractWxAppHttpStatus = source => {
|
|
19
|
+
const obj = source;
|
|
20
|
+
return obj?.statusCode ?? obj?.status ?? obj?.details?.status;
|
|
21
|
+
};
|
|
22
|
+
const markWxAppTelephonyError = (error, source) => {
|
|
23
|
+
const marked = error;
|
|
24
|
+
marked.isWxAppTelephonyError = true;
|
|
25
|
+
const trackingId = extractWxAppTrackingId(source);
|
|
26
|
+
if (trackingId) {
|
|
27
|
+
marked.trackingId = trackingId;
|
|
28
|
+
}
|
|
29
|
+
const status = extractWxAppHttpStatus(source);
|
|
30
|
+
if (status !== undefined) {
|
|
31
|
+
marked.status = status;
|
|
32
|
+
}
|
|
33
|
+
return marked;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* REST telephony client for wxApp thick-client answer (WXCC-6026).
|
|
37
|
+
* Separate from WebCallingService (WebRTC/Mobius).
|
|
38
|
+
*/
|
|
39
|
+
class AnswerCallOnWebexService {
|
|
40
|
+
constructor(webex) {
|
|
41
|
+
this.webex = webex;
|
|
42
|
+
}
|
|
43
|
+
getTelephonyBaseUrl() {
|
|
44
|
+
const services = this.webex.internal.services;
|
|
45
|
+
const hydraUrl = services._serviceUrls?.hydra || services.get('hydra');
|
|
46
|
+
if (!hydraUrl) {
|
|
47
|
+
throw new Error('Telephony base URL is unavailable');
|
|
48
|
+
}
|
|
49
|
+
return `${hydraUrl.replace(/\/$/, '')}/telephony/calls`;
|
|
50
|
+
}
|
|
51
|
+
extractTrackingId(source) {
|
|
52
|
+
return extractWxAppTrackingId(source);
|
|
53
|
+
}
|
|
54
|
+
async telephonyRequest(resource, method, body, logMethod) {
|
|
55
|
+
try {
|
|
56
|
+
const uri = `${this.getTelephonyBaseUrl()}${resource}`;
|
|
57
|
+
_loggerProxy.default.info(`AnswerCallOnWebexService.${logMethod} request`, {
|
|
58
|
+
module: ANSWER_CALL_ON_WEBEX_FILE,
|
|
59
|
+
method: logMethod,
|
|
60
|
+
data: {
|
|
61
|
+
uri,
|
|
62
|
+
bodyKeys: Object.keys(body)
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
const response = await this.webex.request({
|
|
66
|
+
uri,
|
|
67
|
+
method,
|
|
68
|
+
body,
|
|
69
|
+
addAuthHeader: true
|
|
70
|
+
});
|
|
71
|
+
_loggerProxy.default.info(`AnswerCallOnWebexService.${logMethod} success`, {
|
|
72
|
+
module: ANSWER_CALL_ON_WEBEX_FILE,
|
|
73
|
+
method: logMethod,
|
|
74
|
+
data: {
|
|
75
|
+
statusCode: response.statusCode
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return response;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const trackingId = this.extractTrackingId(error);
|
|
81
|
+
_loggerProxy.default.error(`AnswerCallOnWebexService.${logMethod} failed: ${error}`, {
|
|
82
|
+
module: ANSWER_CALL_ON_WEBEX_FILE,
|
|
83
|
+
method: logMethod,
|
|
84
|
+
data: {
|
|
85
|
+
trackingId,
|
|
86
|
+
status: extractWxAppHttpStatus(error)
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const {
|
|
90
|
+
error: detailedError
|
|
91
|
+
} = (0, _Utils.getErrorDetails)(error, logMethod, _constants.CC_FILE);
|
|
92
|
+
throw markWxAppTelephonyError(detailedError, error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
answerCall(params) {
|
|
96
|
+
const {
|
|
97
|
+
callId,
|
|
98
|
+
endpointId,
|
|
99
|
+
lineOwnerId
|
|
100
|
+
} = params;
|
|
101
|
+
return this.telephonyRequest('/answer', _types.HTTP_METHODS.POST, {
|
|
102
|
+
callId,
|
|
103
|
+
endpointId,
|
|
104
|
+
...(lineOwnerId ? {
|
|
105
|
+
lineOwnerId
|
|
106
|
+
} : {})
|
|
107
|
+
}, _constants.METHODS.ACCEPT);
|
|
108
|
+
}
|
|
109
|
+
rejectCall(params) {
|
|
110
|
+
const {
|
|
111
|
+
callId,
|
|
112
|
+
lineOwnerId
|
|
113
|
+
} = params;
|
|
114
|
+
return this.telephonyRequest('/reject', _types.HTTP_METHODS.POST, {
|
|
115
|
+
callId,
|
|
116
|
+
...(lineOwnerId ? {
|
|
117
|
+
lineOwnerId
|
|
118
|
+
} : {})
|
|
119
|
+
}, _constants.METHODS.REJECT);
|
|
120
|
+
}
|
|
121
|
+
muteCall(params) {
|
|
122
|
+
const {
|
|
123
|
+
callId,
|
|
124
|
+
lineOwnerId
|
|
125
|
+
} = params;
|
|
126
|
+
return this.telephonyRequest('/mute', _types.HTTP_METHODS.POST, {
|
|
127
|
+
callId,
|
|
128
|
+
...(lineOwnerId ? {
|
|
129
|
+
lineOwnerId
|
|
130
|
+
} : {})
|
|
131
|
+
}, _constants.METHODS.TOGGLE_MUTE);
|
|
132
|
+
}
|
|
133
|
+
unmuteCall(params) {
|
|
134
|
+
const {
|
|
135
|
+
callId,
|
|
136
|
+
lineOwnerId
|
|
137
|
+
} = params;
|
|
138
|
+
return this.telephonyRequest('/unmute', _types.HTTP_METHODS.POST, {
|
|
139
|
+
callId,
|
|
140
|
+
...(lineOwnerId ? {
|
|
141
|
+
lineOwnerId
|
|
142
|
+
} : {})
|
|
143
|
+
}, _constants.METHODS.TOGGLE_MUTE);
|
|
144
|
+
}
|
|
145
|
+
transmitDtmf(params) {
|
|
146
|
+
const {
|
|
147
|
+
callId,
|
|
148
|
+
dtmf,
|
|
149
|
+
lineOwnerId
|
|
150
|
+
} = params;
|
|
151
|
+
return this.telephonyRequest('/transmitDtmf', _types.HTTP_METHODS.POST, {
|
|
152
|
+
callId,
|
|
153
|
+
dtmf,
|
|
154
|
+
...(lineOwnerId ? {
|
|
155
|
+
lineOwnerId
|
|
156
|
+
} : {})
|
|
157
|
+
}, _constants.METHODS.TRANSMIT_DTMF);
|
|
158
|
+
}
|
|
159
|
+
async getCallDetails(params) {
|
|
160
|
+
const {
|
|
161
|
+
callId,
|
|
162
|
+
lineOwnerId
|
|
163
|
+
} = params;
|
|
164
|
+
const lineOwnerIdQuery = lineOwnerId ? `?lineOwnerId=${encodeURIComponent(lineOwnerId)}` : '';
|
|
165
|
+
const uri = `${this.getTelephonyBaseUrl()}/${callId}${lineOwnerIdQuery}`;
|
|
166
|
+
try {
|
|
167
|
+
_loggerProxy.default.info('AnswerCallOnWebexService.getCallDetails request', {
|
|
168
|
+
module: ANSWER_CALL_ON_WEBEX_FILE,
|
|
169
|
+
method: _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX,
|
|
170
|
+
data: {
|
|
171
|
+
callId
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
const response = await this.webex.request({
|
|
175
|
+
uri,
|
|
176
|
+
method: _types.HTTP_METHODS.GET,
|
|
177
|
+
addAuthHeader: true
|
|
178
|
+
});
|
|
179
|
+
return response.body ?? {};
|
|
180
|
+
} catch (error) {
|
|
181
|
+
if ((0, _wxAppTelephonyUtils.isWxAppCallNotFoundError)(error)) {
|
|
182
|
+
const err = error instanceof Error ? error : new Error(String(error?.message ?? error));
|
|
183
|
+
throw markWxAppTelephonyError(err, error);
|
|
184
|
+
}
|
|
185
|
+
const trackingId = this.extractTrackingId(error);
|
|
186
|
+
_loggerProxy.default.error(`AnswerCallOnWebexService.getCallDetails failed: ${error}`, {
|
|
187
|
+
module: ANSWER_CALL_ON_WEBEX_FILE,
|
|
188
|
+
method: _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX,
|
|
189
|
+
data: {
|
|
190
|
+
trackingId,
|
|
191
|
+
status: extractWxAppHttpStatus(error)
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
const {
|
|
195
|
+
error: detailedError
|
|
196
|
+
} = (0, _Utils.getErrorDetails)(error, _constants.METHODS.GET_CALL_DETAILS_ON_WEBEX, _constants.CC_FILE);
|
|
197
|
+
throw markWxAppTelephonyError(detailedError, error);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.default = AnswerCallOnWebexService;
|
|
202
|
+
//# sourceMappingURL=AnswerCallOnWebexService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_constants","_types","_Utils","_wxAppTelephonyUtils","e","__esModule","default","ANSWER_CALL_ON_WEBEX_FILE","extractWxAppTrackingId","source","sourceObj","details","trackingId","extractWxAppHttpStatus","obj","statusCode","status","markWxAppTelephonyError","error","marked","isWxAppTelephonyError","undefined","AnswerCallOnWebexService","constructor","webex","getTelephonyBaseUrl","services","internal","hydraUrl","_serviceUrls","hydra","get","Error","replace","extractTrackingId","telephonyRequest","resource","method","body","logMethod","uri","LoggerProxy","info","module","data","bodyKeys","Object","keys","response","request","addAuthHeader","detailedError","getErrorDetails","CC_FILE","answerCall","params","callId","endpointId","lineOwnerId","HTTP_METHODS","POST","METHODS","ACCEPT","rejectCall","REJECT","muteCall","TOGGLE_MUTE","unmuteCall","transmitDtmf","dtmf","TRANSMIT_DTMF","getCallDetails","lineOwnerIdQuery","encodeURIComponent","GET_CALL_DETAILS_ON_WEBEX","GET","isWxAppCallNotFoundError","err","String","message","exports"],"sources":["AnswerCallOnWebexService.ts"],"sourcesContent":["import LoggerProxy from '../logger-proxy';\nimport {CC_FILE, METHODS} from '../constants';\nimport {HTTP_METHODS, IHttpResponse, WebexSDK} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport {isWxAppCallNotFoundError} from './wxAppTelephonyUtils';\n\nconst ANSWER_CALL_ON_WEBEX_FILE = 'AnswerCallOnWebexService';\n\nexport type WxAppTelephonyError = Error & {\n isWxAppTelephonyError: true;\n trackingId?: string;\n status?: number | string;\n};\n\nconst extractWxAppTrackingId = (source: unknown): string | undefined => {\n const sourceObj = source as {details?: {trackingId?: string}; trackingId?: string};\n\n return sourceObj?.details?.trackingId || sourceObj?.trackingId;\n};\n\nconst extractWxAppHttpStatus = (source: unknown): number | string | undefined => {\n const obj = source as {\n statusCode?: number;\n status?: number | string;\n details?: {status?: number | string};\n };\n\n return obj?.statusCode ?? obj?.status ?? obj?.details?.status;\n};\n\nconst markWxAppTelephonyError = (error: Error, source: unknown): WxAppTelephonyError => {\n const marked = error as WxAppTelephonyError;\n marked.isWxAppTelephonyError = true;\n const trackingId = extractWxAppTrackingId(source);\n if (trackingId) {\n marked.trackingId = trackingId;\n }\n const status = extractWxAppHttpStatus(source);\n if (status !== undefined) {\n marked.status = status;\n }\n\n return marked;\n};\n\nexport type AnswerCallParams = {\n callId: string;\n endpointId: string;\n lineOwnerId?: string;\n};\n\nexport type CallIdParams = {\n callId: string;\n lineOwnerId?: string;\n};\n\nexport type TransmitDtmfParams = CallIdParams & {\n dtmf: string;\n};\n\nexport type CallDetailsResponse = {\n muted?: boolean;\n};\n\n/**\n * REST telephony client for wxApp thick-client answer (WXCC-6026).\n * Separate from WebCallingService (WebRTC/Mobius).\n */\nexport default class AnswerCallOnWebexService {\n private webex: WebexSDK;\n\n constructor(webex: WebexSDK) {\n this.webex = webex;\n }\n\n private getTelephonyBaseUrl(): string {\n const services = this.webex.internal.services;\n const hydraUrl = services._serviceUrls?.hydra || services.get('hydra');\n\n if (!hydraUrl) {\n throw new Error('Telephony base URL is unavailable');\n }\n\n return `${hydraUrl.replace(/\\/$/, '')}/telephony/calls`;\n }\n\n private extractTrackingId(source: unknown): string | undefined {\n return extractWxAppTrackingId(source);\n }\n\n private async telephonyRequest(\n resource: string,\n method: HTTP_METHODS,\n body: Record<string, unknown>,\n logMethod: string\n ): Promise<IHttpResponse> {\n try {\n const uri = `${this.getTelephonyBaseUrl()}${resource}`;\n\n LoggerProxy.info(`AnswerCallOnWebexService.${logMethod} request`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {uri, bodyKeys: Object.keys(body)},\n });\n\n const response = (await this.webex.request({\n uri,\n method,\n body,\n addAuthHeader: true,\n })) as IHttpResponse;\n\n LoggerProxy.info(`AnswerCallOnWebexService.${logMethod} success`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {statusCode: response.statusCode},\n });\n\n return response;\n } catch (error) {\n const trackingId = this.extractTrackingId(error);\n LoggerProxy.error(`AnswerCallOnWebexService.${logMethod} failed: ${error}`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: logMethod,\n data: {\n trackingId,\n status: extractWxAppHttpStatus(error),\n },\n });\n const {error: detailedError} = getErrorDetails(error, logMethod, CC_FILE);\n throw markWxAppTelephonyError(detailedError, error);\n }\n }\n\n public answerCall(params: AnswerCallParams): Promise<IHttpResponse> {\n const {callId, endpointId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/answer',\n HTTP_METHODS.POST,\n {\n callId,\n endpointId,\n ...(lineOwnerId ? {lineOwnerId} : {}),\n },\n METHODS.ACCEPT\n );\n }\n\n public rejectCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/reject',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.REJECT\n );\n }\n\n public muteCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/mute',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TOGGLE_MUTE\n );\n }\n\n public unmuteCall(params: CallIdParams): Promise<IHttpResponse> {\n const {callId, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/unmute',\n HTTP_METHODS.POST,\n {callId, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TOGGLE_MUTE\n );\n }\n\n public transmitDtmf(params: TransmitDtmfParams): Promise<IHttpResponse> {\n const {callId, dtmf, lineOwnerId} = params;\n\n return this.telephonyRequest(\n '/transmitDtmf',\n HTTP_METHODS.POST,\n {callId, dtmf, ...(lineOwnerId ? {lineOwnerId} : {})},\n METHODS.TRANSMIT_DTMF\n );\n }\n\n public async getCallDetails(params: CallIdParams): Promise<CallDetailsResponse> {\n const {callId, lineOwnerId} = params;\n const lineOwnerIdQuery = lineOwnerId ? `?lineOwnerId=${encodeURIComponent(lineOwnerId)}` : '';\n const uri = `${this.getTelephonyBaseUrl()}/${callId}${lineOwnerIdQuery}`;\n\n try {\n LoggerProxy.info('AnswerCallOnWebexService.getCallDetails request', {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: METHODS.GET_CALL_DETAILS_ON_WEBEX,\n data: {callId},\n });\n\n const response = (await this.webex.request({\n uri,\n method: HTTP_METHODS.GET,\n addAuthHeader: true,\n })) as IHttpResponse;\n\n return (response.body ?? {}) as CallDetailsResponse;\n } catch (error) {\n if (isWxAppCallNotFoundError(error)) {\n const err =\n error instanceof Error\n ? error\n : new Error(String((error as {message?: string})?.message ?? error));\n throw markWxAppTelephonyError(err, error);\n }\n\n const trackingId = this.extractTrackingId(error);\n LoggerProxy.error(`AnswerCallOnWebexService.getCallDetails failed: ${error}`, {\n module: ANSWER_CALL_ON_WEBEX_FILE,\n method: METHODS.GET_CALL_DETAILS_ON_WEBEX,\n data: {\n trackingId,\n status: extractWxAppHttpStatus(error),\n },\n });\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_CALL_DETAILS_ON_WEBEX,\n CC_FILE\n );\n throw markWxAppTelephonyError(detailedError, error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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,21 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
17
18
|
* @public
|
|
18
19
|
*/
|
|
19
20
|
class ApiAIAssistant {
|
|
20
|
-
|
|
21
|
+
createWellnessError(reason) {
|
|
22
|
+
const error = new Error(reason);
|
|
23
|
+
error.details = {
|
|
24
|
+
type: 'SDK_VALIDATION_ERROR',
|
|
25
|
+
orgId: this.webex.credentials.getOrgId(),
|
|
26
|
+
trackingId: '',
|
|
27
|
+
data: {
|
|
28
|
+
reason
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return error;
|
|
32
|
+
}
|
|
33
|
+
constructor(webex, wellnessContextProvider) {
|
|
21
34
|
this.webex = webex;
|
|
35
|
+
this.wellnessContextProvider = wellnessContextProvider;
|
|
22
36
|
this.metricsManager = _MetricsManager.default.getInstance({
|
|
23
37
|
webex
|
|
24
38
|
});
|
|
@@ -26,6 +40,108 @@ class ApiAIAssistant {
|
|
|
26
40
|
setAIFeatureFlags(aiFeature) {
|
|
27
41
|
this.aiFeature = aiFeature;
|
|
28
42
|
}
|
|
43
|
+
async sendWellnessBreakAction(action, method) {
|
|
44
|
+
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
|
|
45
|
+
try {
|
|
46
|
+
const context = this.wellnessContextProvider?.();
|
|
47
|
+
const agentId = context?.agentId?.trim();
|
|
48
|
+
const agentSessionId = context?.agentSessionId?.trim();
|
|
49
|
+
const orgId = this.webex.credentials.getOrgId()?.trim();
|
|
50
|
+
if (context?.isWellnessBreakEnabled !== true) {
|
|
51
|
+
throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');
|
|
52
|
+
}
|
|
53
|
+
if (!orgId) {
|
|
54
|
+
throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');
|
|
55
|
+
}
|
|
56
|
+
if (!agentId) {
|
|
57
|
+
throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');
|
|
58
|
+
}
|
|
59
|
+
if (!agentSessionId) {
|
|
60
|
+
throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');
|
|
61
|
+
}
|
|
62
|
+
const baseUrl = this.getBaseUrl();
|
|
63
|
+
const response = await this.webex.request({
|
|
64
|
+
uri: `${baseUrl}${_constants3.AI_ASSISTANT_API_URLS.EVENT}`,
|
|
65
|
+
method: _types.HTTP_METHODS.POST,
|
|
66
|
+
addAuthHeader: true,
|
|
67
|
+
body: {
|
|
68
|
+
agentId,
|
|
69
|
+
orgId,
|
|
70
|
+
eventType: _types.AIAssistantEventType.CUSTOM_EVENT,
|
|
71
|
+
eventName: _types.AIAssistantEventName.WELLNESS_BREAK_ACTION,
|
|
72
|
+
eventDetails: {
|
|
73
|
+
data: {
|
|
74
|
+
action,
|
|
75
|
+
agentSessionId,
|
|
76
|
+
actionTimeStamp: Date.now()
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
if (response.statusCode !== 202) {
|
|
82
|
+
throw this.createWellnessError(`WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`);
|
|
83
|
+
}
|
|
84
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, {
|
|
85
|
+
action
|
|
86
|
+
}, ['operational']);
|
|
87
|
+
_loggerProxy.default.log('Wellness action accepted by AI Assistant', {
|
|
88
|
+
module: _constants2.CC_FILE,
|
|
89
|
+
method,
|
|
90
|
+
data: {
|
|
91
|
+
action
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
} catch (error) {
|
|
95
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED, {
|
|
96
|
+
action,
|
|
97
|
+
error: error instanceof Error ? error.message : String(error)
|
|
98
|
+
}, ['operational']);
|
|
99
|
+
const {
|
|
100
|
+
error: detailedError
|
|
101
|
+
} = (0, _Utils.getErrorDetails)(error, method, _constants2.CC_FILE);
|
|
102
|
+
throw detailedError;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Requests an Agent Wellness Break.
|
|
108
|
+
* The promise resolves when the HTTP request is accepted with status 202; the later
|
|
109
|
+
* approval or denial is delivered independently through a wellness notification.
|
|
110
|
+
* @returns A promise that resolves with no value after HTTP acceptance
|
|
111
|
+
* @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails
|
|
112
|
+
* @example
|
|
113
|
+
* await webex.cc.apiAIAssistant.requestWellnessBreak();
|
|
114
|
+
* @public
|
|
115
|
+
*/
|
|
116
|
+
async requestWellnessBreak() {
|
|
117
|
+
return this.sendWellnessBreakAction(_types.WELLNESS_BREAK_USER_ACTIONS.REQUESTED, _constants2.METHODS.REQUEST_WELLNESS_BREAK);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Responds to a backend-provided Agent Wellness Break offer.
|
|
122
|
+
* The promise resolves when the HTTP request is accepted with status 202 and does not
|
|
123
|
+
* wait for a WebSocket completion event.
|
|
124
|
+
* @param params - ACCEPTED, REJECTED, or NO_RESPONSE
|
|
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.respondToWellnessBreak({
|
|
129
|
+
* action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,
|
|
130
|
+
* });
|
|
131
|
+
* @public
|
|
132
|
+
*/
|
|
133
|
+
async respondToWellnessBreak(params) {
|
|
134
|
+
const {
|
|
135
|
+
action
|
|
136
|
+
} = params;
|
|
137
|
+
if (![_types.WELLNESS_BREAK_USER_ACTIONS.ACCEPTED, _types.WELLNESS_BREAK_USER_ACTIONS.REJECTED, _types.WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE].includes(action)) {
|
|
138
|
+
const {
|
|
139
|
+
error
|
|
140
|
+
} = (0, _Utils.getErrorDetails)(this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'), _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK, _constants2.CC_FILE);
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
return this.sendWellnessBreakAction(action, _constants2.METHODS.RESPOND_TO_WELLNESS_BREAK);
|
|
144
|
+
}
|
|
29
145
|
getBaseUrl() {
|
|
30
146
|
const wccApiGatewayUrl = this.webex.internal.services.get(_constants3.WCC_API_GATEWAY) || '';
|
|
31
147
|
if (!wccApiGatewayUrl) {
|
|
@@ -56,9 +172,11 @@ class ApiAIAssistant {
|
|
|
56
172
|
* @param interactionId - interaction/conversation identifier
|
|
57
173
|
* @param eventType - the type of event (e.g. 'CUSTOM_EVENT')
|
|
58
174
|
* @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')
|
|
59
|
-
* @param
|
|
175
|
+
* @param eventMetaData - event-specific fields to include in eventDetails.data
|
|
176
|
+
* @param languageCode - language code within eventDetails.data
|
|
177
|
+
* @param trackingId - tracking identifier within eventDetails.data
|
|
60
178
|
*/
|
|
61
|
-
async sendEvent(agentId, interactionId, eventType, eventName,
|
|
179
|
+
async sendEvent(agentId, interactionId, eventType, eventName, eventMetaData, languageCode, trackingId) {
|
|
62
180
|
_loggerProxy.default.info('Sending event', {
|
|
63
181
|
module: _constants2.CC_FILE,
|
|
64
182
|
method: _constants2.METHODS.SEND_EVENT,
|
|
@@ -66,7 +184,7 @@ class ApiAIAssistant {
|
|
|
66
184
|
data: {
|
|
67
185
|
eventType,
|
|
68
186
|
eventName,
|
|
69
|
-
|
|
187
|
+
eventMetaData
|
|
70
188
|
}
|
|
71
189
|
});
|
|
72
190
|
this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED]);
|
|
@@ -84,9 +202,11 @@ class ApiAIAssistant {
|
|
|
84
202
|
eventName,
|
|
85
203
|
eventDetails: {
|
|
86
204
|
data: {
|
|
205
|
+
...eventMetaData,
|
|
87
206
|
interactionId,
|
|
88
|
-
|
|
89
|
-
|
|
207
|
+
actionTimeStamp: String(Date.now()),
|
|
208
|
+
languageCode,
|
|
209
|
+
trackingId
|
|
90
210
|
}
|
|
91
211
|
}
|
|
92
212
|
}
|
|
@@ -96,8 +216,7 @@ class ApiAIAssistant {
|
|
|
96
216
|
orgId,
|
|
97
217
|
interactionId,
|
|
98
218
|
eventType,
|
|
99
|
-
eventName
|
|
100
|
-
action
|
|
219
|
+
eventName
|
|
101
220
|
}, ['operational']);
|
|
102
221
|
return response?.body || {};
|
|
103
222
|
} catch (error) {
|
|
@@ -105,7 +224,6 @@ class ApiAIAssistant {
|
|
|
105
224
|
interactionId,
|
|
106
225
|
eventType,
|
|
107
226
|
eventName,
|
|
108
|
-
action,
|
|
109
227
|
error: error instanceof Error ? error.message : String(error)
|
|
110
228
|
}, ['operational']);
|
|
111
229
|
const {
|
|
@@ -115,6 +233,148 @@ class ApiAIAssistant {
|
|
|
115
233
|
}
|
|
116
234
|
}
|
|
117
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Requests real-time assistance for an interaction.
|
|
238
|
+
*
|
|
239
|
+
* @param params - Real-time assistance request parameters
|
|
240
|
+
* @returns HTTP response body from the AI Assistant event API
|
|
241
|
+
* @public
|
|
242
|
+
*/
|
|
243
|
+
async getRealTimeAssistance(params) {
|
|
244
|
+
const {
|
|
245
|
+
agentId,
|
|
246
|
+
interactionId,
|
|
247
|
+
context
|
|
248
|
+
} = params;
|
|
249
|
+
const trimmedContext = context?.trim();
|
|
250
|
+
const languageCode = params.languageCode ?? 'en';
|
|
251
|
+
const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
|
|
252
|
+
const eventName = trimmedContext ? _types.AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT : _types.AIAssistantEventName.GET_SUGGESTIONS;
|
|
253
|
+
const loggerContext = {
|
|
254
|
+
module: _constants2.CC_FILE,
|
|
255
|
+
method: _constants2.METHODS.GET_REAL_TIME_ASSISTANCE,
|
|
256
|
+
interactionId,
|
|
257
|
+
trackingId,
|
|
258
|
+
data: {
|
|
259
|
+
eventName
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
_loggerProxy.default.info('Requesting real-time assistance', loggerContext);
|
|
263
|
+
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]);
|
|
264
|
+
try {
|
|
265
|
+
if (!this.aiFeature?.suggestedResponses?.enable) {
|
|
266
|
+
const {
|
|
267
|
+
error: detailedError
|
|
268
|
+
} = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
|
|
269
|
+
throw detailedError;
|
|
270
|
+
}
|
|
271
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
272
|
+
const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, eventName, trimmedContext !== undefined ? {
|
|
273
|
+
context: trimmedContext
|
|
274
|
+
} : undefined, languageCode, trackingId);
|
|
275
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS, {
|
|
276
|
+
agentId,
|
|
277
|
+
orgId,
|
|
278
|
+
interactionId,
|
|
279
|
+
eventName,
|
|
280
|
+
trackingId,
|
|
281
|
+
context
|
|
282
|
+
}, ['operational']);
|
|
283
|
+
_loggerProxy.default.log('Real-time assistance request succeeded', loggerContext);
|
|
284
|
+
return response;
|
|
285
|
+
} catch (error) {
|
|
286
|
+
_loggerProxy.default.error('Real-time assistance request failed', {
|
|
287
|
+
...loggerContext,
|
|
288
|
+
error
|
|
289
|
+
});
|
|
290
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED, {
|
|
291
|
+
agentId,
|
|
292
|
+
interactionId,
|
|
293
|
+
trackingId,
|
|
294
|
+
eventName,
|
|
295
|
+
error: error instanceof Error ? error.message : String(error)
|
|
296
|
+
}, ['operational']);
|
|
297
|
+
const {
|
|
298
|
+
error: detailedError
|
|
299
|
+
} = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.GET_REAL_TIME_ASSISTANCE, _constants2.CC_FILE);
|
|
300
|
+
throw detailedError;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Sends user action feedback for a real-time assistance adaptive card.
|
|
306
|
+
*
|
|
307
|
+
* @param params - Real-time assistance user action parameters
|
|
308
|
+
* @returns HTTP response body from the AI Assistant event API
|
|
309
|
+
* @public
|
|
310
|
+
*/
|
|
311
|
+
async sendRealTimeAssistanceUserAction(params) {
|
|
312
|
+
const {
|
|
313
|
+
agentId,
|
|
314
|
+
interactionId,
|
|
315
|
+
adaptiveCardId,
|
|
316
|
+
actionId
|
|
317
|
+
} = params;
|
|
318
|
+
const actionType = 'Action.Submit';
|
|
319
|
+
const languageCode = params.languageCode ?? 'en';
|
|
320
|
+
const trackingId = `WX_CC_SDK_${(0, _uuid.v4)()}`;
|
|
321
|
+
const loggerContext = {
|
|
322
|
+
module: _constants2.CC_FILE,
|
|
323
|
+
method: _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,
|
|
324
|
+
interactionId,
|
|
325
|
+
trackingId,
|
|
326
|
+
data: {
|
|
327
|
+
actionId,
|
|
328
|
+
adaptiveCardId
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
_loggerProxy.default.info('Sending real-time assistance user action', loggerContext);
|
|
332
|
+
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]);
|
|
333
|
+
try {
|
|
334
|
+
if (!this.aiFeature?.suggestedResponses?.enable) {
|
|
335
|
+
const {
|
|
336
|
+
error: detailedError
|
|
337
|
+
} = (0, _Utils.getErrorDetails)(new Error('SUGGESTED_RESPONSES_NOT_ENABLED'), _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
|
|
338
|
+
throw detailedError;
|
|
339
|
+
}
|
|
340
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
341
|
+
const response = await this.sendEvent(agentId, interactionId, _types.AIAssistantEventType.CUSTOM_EVENT, _types.AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION, {
|
|
342
|
+
adaptiveCardId,
|
|
343
|
+
userAction: {
|
|
344
|
+
actionType,
|
|
345
|
+
actionId
|
|
346
|
+
}
|
|
347
|
+
}, languageCode, trackingId);
|
|
348
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS, {
|
|
349
|
+
agentId,
|
|
350
|
+
orgId,
|
|
351
|
+
interactionId,
|
|
352
|
+
adaptiveCardId,
|
|
353
|
+
actionId,
|
|
354
|
+
trackingId
|
|
355
|
+
}, ['operational']);
|
|
356
|
+
_loggerProxy.default.log('Real-time assistance user action sent', loggerContext);
|
|
357
|
+
return response;
|
|
358
|
+
} catch (error) {
|
|
359
|
+
_loggerProxy.default.error('Real-time assistance user action failed', {
|
|
360
|
+
...loggerContext,
|
|
361
|
+
error
|
|
362
|
+
});
|
|
363
|
+
this.metricsManager.trackEvent(_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED, {
|
|
364
|
+
agentId,
|
|
365
|
+
interactionId,
|
|
366
|
+
adaptiveCardId,
|
|
367
|
+
actionId,
|
|
368
|
+
trackingId,
|
|
369
|
+
error: error instanceof Error ? error.message : String(error)
|
|
370
|
+
}, ['operational']);
|
|
371
|
+
const {
|
|
372
|
+
error: detailedError
|
|
373
|
+
} = (0, _Utils.getErrorDetails)(error, _constants2.METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION, _constants2.CC_FILE);
|
|
374
|
+
throw detailedError;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
118
378
|
/**
|
|
119
379
|
* Fetches historic transcripts for an interaction.
|
|
120
380
|
* This API is allowed only when real-time transcription feature is enabled.
|