@webex/contact-center 3.10.0-next.17 → 3.10.0-next.19
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/dist/cc.js +2 -1
- package/dist/cc.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/logger-proxy.js.map +1 -1
- package/dist/metrics/MetricsManager.js +2 -1
- package/dist/metrics/MetricsManager.js.map +1 -1
- package/dist/metrics/behavioral-events.js +12 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +4 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +2 -3
- package/dist/services/AddressBook.js.map +1 -1
- package/dist/services/EntryPoint.js +2 -3
- package/dist/services/EntryPoint.js.map +1 -1
- package/dist/services/Queue.js +2 -3
- package/dist/services/Queue.js.map +1 -1
- package/dist/services/WebCallingService.js +1 -1
- package/dist/services/WebCallingService.js.map +1 -1
- package/dist/services/agent/index.js +1 -2
- package/dist/services/agent/index.js.map +1 -1
- package/dist/services/agent/types.js +10 -0
- package/dist/services/agent/types.js.map +1 -1
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +1 -1
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/GlobalTypes.js.map +1 -1
- package/dist/services/core/Utils.js +2 -3
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/WebexRequest.js +1 -2
- package/dist/services/core/WebexRequest.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +2 -3
- package/dist/services/core/aqm-reqs.js.map +1 -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 +1 -2
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/connection-service.js +1 -1
- package/dist/services/core/websocket/connection-service.js.map +1 -1
- package/dist/services/core/websocket/keepalive.worker.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/AutoWrapup.js +1 -1
- package/dist/services/task/AutoWrapup.js.map +1 -1
- package/dist/services/task/TaskManager.js +113 -36
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +90 -1
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/constants.js +3 -1
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +0 -2
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/dialer.js.map +1 -1
- package/dist/services/task/index.js +1 -1
- package/dist/services/task/index.js.map +1 -1
- package/dist/services/task/types.js +359 -0
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/metrics/constants.d.ts +4 -0
- package/dist/types/services/task/TaskUtils.d.ts +42 -0
- package/dist/types/services/task/constants.d.ts +2 -0
- package/dist/types/services/task/types.d.ts +6 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +1 -1
- package/dist/utils/PageCache.js.map +1 -1
- package/dist/webex-config.js.map +1 -1
- package/dist/webex.js +2 -2
- package/dist/webex.js.map +1 -1
- package/package.json +8 -8
- package/src/cc.ts +1 -0
- package/src/metrics/behavioral-events.ts +12 -0
- package/src/metrics/constants.ts +4 -0
- package/src/services/task/TaskManager.ts +127 -29
- package/src/services/task/TaskUtils.ts +109 -1
- package/src/services/task/constants.ts +2 -0
- package/src/services/task/types.ts +6 -0
- package/test/unit/spec/cc.ts +1 -0
- package/test/unit/spec/metrics/behavioral-events.ts +14 -0
- package/test/unit/spec/services/task/TaskManager.ts +143 -0
- package/test/unit/spec/services/task/TaskUtils.ts +305 -3
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["workerScript","_default","exports","default"],"sources":["keepalive.worker.js"],"sourcesContent":["// TODO: Try to find alternative to using Blob and script here\nconst workerScript = `\nconsole.log(\"*** Keepalive Worker Thread ***\");\nlet intervalId, intervalDuration, timeOutId, isSocketClosed, closeSocketTimeout;\nlet initialised = false;\nlet initiateWebSocketClosure = false;\n\nconst resetOfflineHandler = function () {\n if (timeOutId) {\n initialised = false;\n clearTimeout(timeOutId);\n timeOutId = null;\n }\n};\n\nconst checkOnlineStatus = function () {\n const onlineStatus = navigator.onLine;\n console.log(\n \\`[WebSocketStatus] event=checkOnlineStatus | online status=\\`,\n onlineStatus\n );\n return onlineStatus;\n};\n\n// Checks network status and if it's offline then force closes WebSocket\nconst checkNetworkStatus = function () {\n const onlineStatus = checkOnlineStatus();\n postMessage({ type: \"keepalive\", onlineStatus });\n if (!onlineStatus && !initialised) {\n initialised = true;\n // Sets a timeout of 16s, checks if socket didn't close then it closes forcefully\n timeOutId = setTimeout(() => {\n if (!isSocketClosed) {\n initiateWebSocketClosure = true;\n postMessage({ type: \"closeSocket\" });\n }\n }, closeSocketTimeout);\n }\n\n if (onlineStatus && initialised) {\n initialised = false;\n }\n\n if (initiateWebSocketClosure) {\n initiateWebSocketClosure = false;\n clearTimeout(timeOutId);\n timeOutId = null;\n }\n};\n\naddEventListener(\"message\", (event) => {\n if (event.data?.type === \"start\") {\n intervalDuration = event.data?.intervalDuration || 4000;\n closeSocketTimeout = event.data?.closeSocketTimeout || 5000;\n console.log(\"event=Websocket startWorker | keepalive Worker started\");\n intervalId = setInterval(\n (checkIfSocketClosed) => {\n checkNetworkStatus();\n isSocketClosed = checkIfSocketClosed;\n },\n intervalDuration,\n event.data?.isSocketClosed\n );\n\n resetOfflineHandler();\n }\n\n if (event.data?.type === \"terminate\" && intervalId) {\n console.log(\"event=Websocket terminateWorker | keepalive Worker stopped\");\n clearInterval(intervalId);\n intervalId = null;\n resetOfflineHandler();\n }\n});\n\n// Listen for online and offline events\nself.addEventListener('online', () => {\n console.log('Network status: online');\n checkNetworkStatus();\n});\n\nself.addEventListener('offline', () => {\n console.log('Network status: offline');\n checkNetworkStatus();\n});\n`;\n\nexport default workerScript;\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,YAAY,
|
|
1
|
+
{"version":3,"names":["workerScript","_default","exports","default"],"sources":["keepalive.worker.js"],"sourcesContent":["// TODO: Try to find alternative to using Blob and script here\nconst workerScript = `\nconsole.log(\"*** Keepalive Worker Thread ***\");\nlet intervalId, intervalDuration, timeOutId, isSocketClosed, closeSocketTimeout;\nlet initialised = false;\nlet initiateWebSocketClosure = false;\n\nconst resetOfflineHandler = function () {\n if (timeOutId) {\n initialised = false;\n clearTimeout(timeOutId);\n timeOutId = null;\n }\n};\n\nconst checkOnlineStatus = function () {\n const onlineStatus = navigator.onLine;\n console.log(\n \\`[WebSocketStatus] event=checkOnlineStatus | online status=\\`,\n onlineStatus\n );\n return onlineStatus;\n};\n\n// Checks network status and if it's offline then force closes WebSocket\nconst checkNetworkStatus = function () {\n const onlineStatus = checkOnlineStatus();\n postMessage({ type: \"keepalive\", onlineStatus });\n if (!onlineStatus && !initialised) {\n initialised = true;\n // Sets a timeout of 16s, checks if socket didn't close then it closes forcefully\n timeOutId = setTimeout(() => {\n if (!isSocketClosed) {\n initiateWebSocketClosure = true;\n postMessage({ type: \"closeSocket\" });\n }\n }, closeSocketTimeout);\n }\n\n if (onlineStatus && initialised) {\n initialised = false;\n }\n\n if (initiateWebSocketClosure) {\n initiateWebSocketClosure = false;\n clearTimeout(timeOutId);\n timeOutId = null;\n }\n};\n\naddEventListener(\"message\", (event) => {\n if (event.data?.type === \"start\") {\n intervalDuration = event.data?.intervalDuration || 4000;\n closeSocketTimeout = event.data?.closeSocketTimeout || 5000;\n console.log(\"event=Websocket startWorker | keepalive Worker started\");\n intervalId = setInterval(\n (checkIfSocketClosed) => {\n checkNetworkStatus();\n isSocketClosed = checkIfSocketClosed;\n },\n intervalDuration,\n event.data?.isSocketClosed\n );\n\n resetOfflineHandler();\n }\n\n if (event.data?.type === \"terminate\" && intervalId) {\n console.log(\"event=Websocket terminateWorker | keepalive Worker stopped\");\n clearInterval(intervalId);\n intervalId = null;\n resetOfflineHandler();\n }\n});\n\n// Listen for online and offline events\nself.addEventListener('online', () => {\n console.log('Network status: online');\n checkNetworkStatus();\n});\n\nself.addEventListener('offline', () => {\n console.log('Network status: offline');\n checkNetworkStatus();\n});\n`;\n\nexport default workerScript;\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,YAAY,GAAG;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaH,YAAY","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {SubscribeRequest} from '../../../types';\nimport {WebSocketManager} from './WebSocketManager';\n\n/**\n * Options for initializing a connection service.\n * @typedef ConnectionServiceOptions\n * @property {WebSocketManager} webSocketManager - The WebSocket manager instance.\n * @property {SubscribeRequest} subscribeRequest - The subscribe request payload.\n * @ignore\n */\nexport type ConnectionServiceOptions = {\n webSocketManager: WebSocketManager;\n subscribeRequest: SubscribeRequest;\n};\n\n/**\n * Details about the state of a lost connection and recovery attempts.\n * @typedef ConnectionLostDetails\n * @property {boolean} isConnectionLost - Indicates if the connection is currently lost.\n * @property {boolean} isRestoreFailed - Indicates if restoring the connection has failed.\n * @property {boolean} isSocketReconnected - Indicates if the socket has been reconnected.\n * @property {boolean} isKeepAlive - Indicates if the keep-alive mechanism is active.\n * @ignore\n */\nexport type ConnectionLostDetails = {\n isConnectionLost: boolean;\n isRestoreFailed: boolean;\n isSocketReconnected: boolean;\n isKeepAlive: boolean;\n};\n\n/**\n * Properties for connection configuration.\n * @typedef ConnectionProp\n * @property {number} lostConnectionRecoveryTimeout - Timeout in milliseconds for lost connection recovery.\n * @ignore\n */\nexport type ConnectionProp = {\n lostConnectionRecoveryTimeout: number;\n};\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {SubscribeRequest} from '../../../types';\nimport {WebSocketManager} from './WebSocketManager';\n\n/**\n * Options for initializing a connection service.\n * @typedef ConnectionServiceOptions\n * @property {WebSocketManager} webSocketManager - The WebSocket manager instance.\n * @property {SubscribeRequest} subscribeRequest - The subscribe request payload.\n * @ignore\n */\nexport type ConnectionServiceOptions = {\n webSocketManager: WebSocketManager;\n subscribeRequest: SubscribeRequest;\n};\n\n/**\n * Details about the state of a lost connection and recovery attempts.\n * @typedef ConnectionLostDetails\n * @property {boolean} isConnectionLost - Indicates if the connection is currently lost.\n * @property {boolean} isRestoreFailed - Indicates if restoring the connection has failed.\n * @property {boolean} isSocketReconnected - Indicates if the socket has been reconnected.\n * @property {boolean} isKeepAlive - Indicates if the keep-alive mechanism is active.\n * @ignore\n */\nexport type ConnectionLostDetails = {\n isConnectionLost: boolean;\n isRestoreFailed: boolean;\n isSocketReconnected: boolean;\n isKeepAlive: boolean;\n};\n\n/**\n * Properties for connection configuration.\n * @typedef ConnectionProp\n * @property {number} lostConnectionRecoveryTimeout - Timeout in milliseconds for lost connection recovery.\n * @ignore\n */\nexport type ConnectionProp = {\n lostConnectionRecoveryTimeout: number;\n};\n"],"mappings":"","ignoreList":[]}
|
package/dist/services/index.js
CHANGED
|
@@ -11,7 +11,7 @@ var _aqmReqs = _interopRequireDefault(require("./core/aqm-reqs"));
|
|
|
11
11
|
var _WebSocketManager = require("./core/websocket/WebSocketManager");
|
|
12
12
|
var _connectionService = require("./core/websocket/connection-service");
|
|
13
13
|
var _dialer = _interopRequireDefault(require("./task/dialer"));
|
|
14
|
-
function _interopRequireDefault(
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
15
|
/**
|
|
16
16
|
* Services class provides centralized access to all contact center plugin services
|
|
17
17
|
* using a singleton pattern to ensure a single instance throughout the application.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_agent","_interopRequireDefault","require","_contact","_config","_aqmReqs","_WebSocketManager","_connectionService","_dialer","
|
|
1
|
+
{"version":3,"names":["_agent","_interopRequireDefault","require","_contact","_config","_aqmReqs","_WebSocketManager","_connectionService","_dialer","e","__esModule","default","Services","constructor","options","webex","connectionConfig","webSocketManager","WebSocketManager","aqmReq","AqmReqs","config","AgentConfigService","agent","routingAgent","contact","routingContact","dialer","aqmDialer","connectionService","ConnectionService","subscribeRequest","getInstance","instance","exports"],"sources":["index.ts"],"sourcesContent":["import routingAgent from './agent';\nimport routingContact from './task/contact';\nimport AgentConfigService from './config';\nimport AqmReqs from './core/aqm-reqs';\nimport {WebSocketManager} from './core/websocket/WebSocketManager';\nimport {ConnectionService} from './core/websocket/connection-service';\nimport {WebexSDK, SubscribeRequest} from '../types';\nimport aqmDialer from './task/dialer';\n\n/**\n * Services class provides centralized access to all contact center plugin services\n * using a singleton pattern to ensure a single instance throughout the application.\n * @private\n * @ignore\n * @class\n */\nexport default class Services {\n /** Agent services for managing agent state and capabilities */\n public readonly agent: ReturnType<typeof routingAgent>;\n /** Configuration services for agent settings */\n public readonly config: AgentConfigService;\n /** Contact services for managing customer interactions */\n public readonly contact: ReturnType<typeof routingContact>;\n /** Dialer services for outbound calling features */\n public readonly dialer: ReturnType<typeof aqmDialer>;\n /** WebSocket manager for handling real-time communications */\n public readonly webSocketManager: WebSocketManager;\n /** Connection service for managing websocket connections */\n public readonly connectionService: ConnectionService;\n /** Singleton instance of the Services class */\n private static instance: Services;\n\n /**\n * Creates a new Services instance\n * @param options - Configuration options\n * @param options.webex - WebexSDK instance\n * @param options.connectionConfig - Subscription configuration for websocket connection\n */\n constructor(options: {webex: WebexSDK; connectionConfig: SubscribeRequest}) {\n const {webex, connectionConfig} = options;\n this.webSocketManager = new WebSocketManager({webex});\n const aqmReq = new AqmReqs(this.webSocketManager);\n this.config = new AgentConfigService();\n this.agent = routingAgent(aqmReq);\n this.contact = routingContact(aqmReq);\n this.dialer = aqmDialer(aqmReq);\n this.connectionService = new ConnectionService({\n webSocketManager: this.webSocketManager,\n subscribeRequest: connectionConfig,\n });\n }\n\n /**\n * Gets singleton instance of Services class\n * Creates a new instance if one doesn't exist\n * @param options - Configuration options\n * @param options.webex - WebexSDK instance\n * @param options.connectionConfig - Subscription configuration for websocket connection\n * @returns The singleton Services instance\n */\n public static getInstance(options: {\n webex: WebexSDK;\n connectionConfig: SubscribeRequest;\n }): Services {\n if (!this.instance) {\n this.instance = new Services(options);\n }\n\n return this.instance;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,QAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AACA,IAAAK,kBAAA,GAAAL,OAAA;AAEA,IAAAM,OAAA,GAAAP,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,MAAMG,QAAQ,CAAC;EAC5B;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAGA;AACF;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,OAA8D,EAAE;IAC1E,MAAM;MAACC,KAAK;MAAEC;IAAgB,CAAC,GAAGF,OAAO;IACzC,IAAI,CAACG,gBAAgB,GAAG,IAAIC,kCAAgB,CAAC;MAACH;IAAK,CAAC,CAAC;IACrD,MAAMI,MAAM,GAAG,IAAIC,gBAAO,CAAC,IAAI,CAACH,gBAAgB,CAAC;IACjD,IAAI,CAACI,MAAM,GAAG,IAAIC,eAAkB,CAAC,CAAC;IACtC,IAAI,CAACC,KAAK,GAAG,IAAAC,cAAY,EAACL,MAAM,CAAC;IACjC,IAAI,CAACM,OAAO,GAAG,IAAAC,gBAAc,EAACP,MAAM,CAAC;IACrC,IAAI,CAACQ,MAAM,GAAG,IAAAC,eAAS,EAACT,MAAM,CAAC;IAC/B,IAAI,CAACU,iBAAiB,GAAG,IAAIC,oCAAiB,CAAC;MAC7Cb,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCc,gBAAgB,EAAEf;IACpB,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcgB,WAAWA,CAAClB,OAGzB,EAAY;IACX,IAAI,CAAC,IAAI,CAACmB,QAAQ,EAAE;MAClB,IAAI,CAACA,QAAQ,GAAG,IAAIrB,QAAQ,CAACE,OAAO,CAAC;IACvC;IAEA,OAAO,IAAI,CAACmB,QAAQ;EACtB;AACF;AAACC,OAAA,CAAAvB,OAAA,GAAAC,QAAA","ignoreList":[]}
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
|
|
8
|
-
function _interopRequireDefault(
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
9
|
/**
|
|
10
10
|
* AutoWrapup class implements a timer for automatic wrap-up functionality.
|
|
11
11
|
* It handles timing the wrap-up period and executing a callback when the timer completes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","
|
|
1
|
+
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","e","__esModule","default","AutoWrapup","timer","startTime","allowCancelAutoWrapup","constructor","interval","start","onComplete","LoggerProxy","info","module","method","clear","Date","now","setTimeout","clearTimeout","getTimeLeft","elapsed","Math","max","isRunning","getTimeLeftSeconds","ceil","exports"],"sources":["AutoWrapup.ts"],"sourcesContent":["import LoggerProxy from '../../logger-proxy';\n\n/**\n * AutoWrapup class implements a timer for automatic wrap-up functionality.\n * It handles timing the wrap-up period and executing a callback when the timer completes.\n */\nexport default class AutoWrapup {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private startTime = 0;\n private readonly interval: number;\n public allowCancelAutoWrapup = false;\n\n /**\n * Creates a new AutoWrapup timer\n * @param interval - Time in milliseconds before auto wrap-up executes\n * @param allowCancelAutoWrapup - Whether to allow canceling the auto wrap-up\n */\n constructor(interval: number, allowCancelAutoWrapup = false) {\n this.interval = interval;\n this.allowCancelAutoWrapup = allowCancelAutoWrapup;\n }\n\n /**\n * Starts the auto wrap-up timer\n * @param onComplete - Callback function to execute when timer completes\n */\n public start(onComplete: () => void): void {\n LoggerProxy.info('AutoWrapup: clear called', {\n module: 'AutoWrapup',\n method: 'clear',\n });\n\n if (this.timer) {\n this.clear();\n }\n\n this.startTime = Date.now();\n\n this.timer = setTimeout(() => {\n onComplete();\n this.timer = null;\n }, this.interval);\n }\n\n /**\n * Clears the auto wrap-up timer if it's running\n */\n public clear(): void {\n LoggerProxy.info('AutoWrapup: clear called', {\n module: 'AutoWrapup',\n method: 'clear',\n });\n\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n this.startTime = 0;\n }\n }\n\n /**\n * Gets the remaining time in milliseconds\n * @returns Time left in milliseconds\n */\n public getTimeLeft(): number {\n const elapsed = Date.now() - this.startTime;\n\n return Math.max(0, this.interval - elapsed);\n }\n\n /**\n * Checks if the timer is currently running\n * @returns True if the timer is running, false otherwise\n */\n public isRunning(): boolean {\n return this.timer !== null;\n }\n\n /**\n * Gets the remaining time in seconds (rounded)\n * @returns Time left in seconds\n */\n public getTimeLeftSeconds(): number {\n return Math.ceil(this.getTimeLeft() / 1000);\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7C;AACA;AACA;AACA;AACe,MAAMG,UAAU,CAAC;EACtBC,KAAK,GAAyC,IAAI;EAClDC,SAAS,GAAG,CAAC;EAEdC,qBAAqB,GAAG,KAAK;;EAEpC;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACC,QAAgB,EAAEF,qBAAqB,GAAG,KAAK,EAAE;IAC3D,IAAI,CAACE,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACF,qBAAqB,GAAGA,qBAAqB;EACpD;;EAEA;AACF;AACA;AACA;EACSG,KAAKA,CAACC,UAAsB,EAAQ;IACzCC,oBAAW,CAACC,IAAI,CAAC,0BAA0B,EAAE;MAC3CC,MAAM,EAAE,YAAY;MACpBC,MAAM,EAAE;IACV,CAAC,CAAC;IAEF,IAAI,IAAI,CAACV,KAAK,EAAE;MACd,IAAI,CAACW,KAAK,CAAC,CAAC;IACd;IAEA,IAAI,CAACV,SAAS,GAAGW,IAAI,CAACC,GAAG,CAAC,CAAC;IAE3B,IAAI,CAACb,KAAK,GAAGc,UAAU,CAAC,MAAM;MAC5BR,UAAU,CAAC,CAAC;MACZ,IAAI,CAACN,KAAK,GAAG,IAAI;IACnB,CAAC,EAAE,IAAI,CAACI,QAAQ,CAAC;EACnB;;EAEA;AACF;AACA;EACSO,KAAKA,CAAA,EAAS;IACnBJ,oBAAW,CAACC,IAAI,CAAC,0BAA0B,EAAE;MAC3CC,MAAM,EAAE,YAAY;MACpBC,MAAM,EAAE;IACV,CAAC,CAAC;IAEF,IAAI,IAAI,CAACV,KAAK,EAAE;MACde,YAAY,CAAC,IAAI,CAACf,KAAK,CAAC;MACxB,IAAI,CAACA,KAAK,GAAG,IAAI;MACjB,IAAI,CAACC,SAAS,GAAG,CAAC;IACpB;EACF;;EAEA;AACF;AACA;AACA;EACSe,WAAWA,CAAA,EAAW;IAC3B,MAAMC,OAAO,GAAGL,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACZ,SAAS;IAE3C,OAAOiB,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,IAAI,CAACf,QAAQ,GAAGa,OAAO,CAAC;EAC7C;;EAEA;AACF;AACA;AACA;EACSG,SAASA,CAAA,EAAY;IAC1B,OAAO,IAAI,CAACpB,KAAK,KAAK,IAAI;EAC5B;;EAEA;AACF;AACA;AACA;EACSqB,kBAAkBA,CAAA,EAAW;IAClC,OAAOH,IAAI,CAACI,IAAI,CAAC,IAAI,CAACN,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC;EAC7C;AACF;AAACO,OAAA,CAAAzB,OAAA,GAAAC,UAAA","ignoreList":[]}
|
|
@@ -16,7 +16,7 @@ var _ = _interopRequireDefault(require("."));
|
|
|
16
16
|
var _MetricsManager = _interopRequireDefault(require("../../metrics/MetricsManager"));
|
|
17
17
|
var _constants3 = require("../../metrics/constants");
|
|
18
18
|
var _TaskUtils = require("./TaskUtils");
|
|
19
|
-
function _interopRequireDefault(
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
20
|
/** @internal */
|
|
21
21
|
class TaskManager extends _events.default {
|
|
22
22
|
/**
|
|
@@ -55,6 +55,9 @@ class TaskManager extends _events.default {
|
|
|
55
55
|
getAgentId() {
|
|
56
56
|
return this.agentId;
|
|
57
57
|
}
|
|
58
|
+
setWebRtcEnabled(webRtcEnabled) {
|
|
59
|
+
this.webRtcEnabled = webRtcEnabled;
|
|
60
|
+
}
|
|
58
61
|
handleIncomingWebCall = call => {
|
|
59
62
|
const currentTask = Object.values(this.taskCollection).find(task => task.data.interaction.mediaType === 'telephony');
|
|
60
63
|
if (currentTask) {
|
|
@@ -105,10 +108,14 @@ class TaskManager extends _events.default {
|
|
|
105
108
|
method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
|
|
106
109
|
interactionId: payload.data.interactionId
|
|
107
110
|
});
|
|
111
|
+
|
|
112
|
+
// Check if auto-answer should happen for this task
|
|
113
|
+
const shouldAutoAnswer = (0, _TaskUtils.shouldAutoAnswerTask)(payload.data, this.agentId, this.webCallingService.loginOption, this.webRtcEnabled);
|
|
108
114
|
task = new _.default(this.contact, this.webCallingService, {
|
|
109
115
|
...payload.data,
|
|
110
116
|
wrapUpRequired: payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,
|
|
111
|
-
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(payload.data)
|
|
117
|
+
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(payload.data),
|
|
118
|
+
isAutoAnswering: shouldAutoAnswer // Set flag before emitting
|
|
112
119
|
}, this.wrapupData, this.agentId);
|
|
113
120
|
this.taskCollection[payload.data.interactionId] = task;
|
|
114
121
|
// Condition 1: The state is=new i.e it is a incoming task
|
|
@@ -131,18 +138,23 @@ class TaskManager extends _events.default {
|
|
|
131
138
|
}
|
|
132
139
|
break;
|
|
133
140
|
case _types2.CC_EVENTS.AGENT_CONTACT_RESERVED:
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
this.
|
|
142
|
-
|
|
143
|
-
this.
|
|
141
|
+
{
|
|
142
|
+
// Check if auto-answer should happen for this task
|
|
143
|
+
const shouldAutoAnswerReserved = (0, _TaskUtils.shouldAutoAnswerTask)(payload.data, this.agentId, this.webCallingService.loginOption, this.webRtcEnabled);
|
|
144
|
+
task = new _.default(this.contact, this.webCallingService, {
|
|
145
|
+
...payload.data,
|
|
146
|
+
isConsulted: false,
|
|
147
|
+
isAutoAnswering: shouldAutoAnswerReserved // Set flag before emitting
|
|
148
|
+
}, this.wrapupData, this.agentId);
|
|
149
|
+
this.taskCollection[payload.data.interactionId] = task;
|
|
150
|
+
if (this.webCallingService.loginOption !== _types3.LoginOption.BROWSER || task.data.interaction.mediaType !== _types.MEDIA_CHANNEL.TELEPHONY // for digital channels
|
|
151
|
+
) {
|
|
152
|
+
this.emit(_types.TASK_EVENTS.TASK_INCOMING, task);
|
|
153
|
+
} else if (this.call) {
|
|
154
|
+
this.emit(_types.TASK_EVENTS.TASK_INCOMING, task);
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
144
157
|
}
|
|
145
|
-
break;
|
|
146
158
|
case _types2.CC_EVENTS.AGENT_OFFER_CONTACT:
|
|
147
159
|
// We don't have to emit any event here since this will be result of promise.
|
|
148
160
|
task = this.updateTaskData(task, payload.data);
|
|
@@ -152,20 +164,25 @@ class TaskManager extends _events.default {
|
|
|
152
164
|
interactionId: payload.data?.interactionId
|
|
153
165
|
});
|
|
154
166
|
this.emit(_types.TASK_EVENTS.TASK_OFFER_CONTACT, task);
|
|
167
|
+
|
|
168
|
+
// Handle auto-answer for offer contact
|
|
169
|
+
this.handleAutoAnswer(task);
|
|
155
170
|
break;
|
|
156
171
|
case _types2.CC_EVENTS.AGENT_OUTBOUND_FAILED:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
172
|
+
if (task) {
|
|
173
|
+
task = this.updateTaskData(task, payload.data);
|
|
174
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_OUTDIAL_FAILED, {
|
|
175
|
+
..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(payload.data),
|
|
176
|
+
taskId: payload.data.interactionId,
|
|
177
|
+
reason: payload.data.reasonCode || payload.data.reason
|
|
178
|
+
}, ['behavioral', 'operational']);
|
|
179
|
+
_loggerProxy.default.log(`Agent outbound failed for task`, {
|
|
180
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
181
|
+
method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
|
|
182
|
+
interactionId: payload.data.interactionId
|
|
183
|
+
});
|
|
184
|
+
task.emit(_types.TASK_EVENTS.TASK_OUTDIAL_FAILED, payload.data.reason ?? 'UNKNOWN_REASON');
|
|
185
|
+
}
|
|
169
186
|
break;
|
|
170
187
|
case _types2.CC_EVENTS.AGENT_CONTACT_ASSIGNED:
|
|
171
188
|
task = this.updateTaskData(task, payload.data);
|
|
@@ -199,14 +216,16 @@ class TaskManager extends _events.default {
|
|
|
199
216
|
}
|
|
200
217
|
case _types2.CC_EVENTS.CONTACT_ENDED:
|
|
201
218
|
// Update task data
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
219
|
+
if (task) {
|
|
220
|
+
task = this.updateTaskData(task, {
|
|
221
|
+
...payload.data,
|
|
222
|
+
wrapUpRequired: payload.data.interaction.state !== 'new' && !(0, _TaskUtils.isSecondaryEpDnAgent)(payload.data.interaction)
|
|
223
|
+
});
|
|
206
224
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
225
|
+
// Handle cleanup based on whether task should be deleted
|
|
226
|
+
this.handleTaskCleanup(task);
|
|
227
|
+
task?.emit(_types.TASK_EVENTS.TASK_END, task);
|
|
228
|
+
}
|
|
210
229
|
break;
|
|
211
230
|
case _types2.CC_EVENTS.CONTACT_MERGED:
|
|
212
231
|
task = this.handleContactMerged(task, payload.data);
|
|
@@ -238,7 +257,6 @@ class TaskManager extends _events.default {
|
|
|
238
257
|
...payload.data,
|
|
239
258
|
isConsulted: false // This ensures that the task consult status is always reset
|
|
240
259
|
});
|
|
241
|
-
|
|
242
260
|
task.emit(_types.TASK_EVENTS.TASK_CONSULT_CREATED, task);
|
|
243
261
|
break;
|
|
244
262
|
case _types2.CC_EVENTS.AGENT_OFFER_CONSULT:
|
|
@@ -247,8 +265,10 @@ class TaskManager extends _events.default {
|
|
|
247
265
|
...payload.data,
|
|
248
266
|
isConsulted: true // This ensures that the task is marked as us being requested for a consult
|
|
249
267
|
});
|
|
250
|
-
|
|
251
268
|
task.emit(_types.TASK_EVENTS.TASK_OFFER_CONSULT, task);
|
|
269
|
+
|
|
270
|
+
// Handle auto-answer for consult offer
|
|
271
|
+
this.handleAutoAnswer(task);
|
|
252
272
|
break;
|
|
253
273
|
case _types2.CC_EVENTS.AGENT_CONSULTING:
|
|
254
274
|
// Received when agent is in an active consult state
|
|
@@ -468,6 +488,63 @@ class TaskManager extends _events.default {
|
|
|
468
488
|
}
|
|
469
489
|
}
|
|
470
490
|
|
|
491
|
+
/**
|
|
492
|
+
* Handles auto-answer logic for incoming tasks
|
|
493
|
+
* Automatically accepts tasks when isAutoAnswering flag is set
|
|
494
|
+
* The flag is set during task creation based on:
|
|
495
|
+
* 1. WebRTC calls with auto-answer enabled in agent profile
|
|
496
|
+
* 2. Agent-initiated WebRTC outdial calls
|
|
497
|
+
* 3. Agent-initiated digital outbound (Email/SMS) without previous transfers
|
|
498
|
+
*
|
|
499
|
+
* @param task - The task to auto-answer
|
|
500
|
+
* @private
|
|
501
|
+
*/
|
|
502
|
+
async handleAutoAnswer(task) {
|
|
503
|
+
if (!task || !task.data || !task.data.isAutoAnswering) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
_loggerProxy.default.info(`Auto-answering task`, {
|
|
507
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
508
|
+
method: 'handleAutoAnswer',
|
|
509
|
+
interactionId: task.data.interactionId
|
|
510
|
+
});
|
|
511
|
+
try {
|
|
512
|
+
await task.accept();
|
|
513
|
+
_loggerProxy.default.info(`Task auto-answered successfully`, {
|
|
514
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
515
|
+
method: 'handleAutoAnswer',
|
|
516
|
+
interactionId: task.data.interactionId
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// Track successful auto-answer
|
|
520
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_SUCCESS, {
|
|
521
|
+
taskId: task.data.interactionId,
|
|
522
|
+
mediaType: task.data.interaction.mediaType,
|
|
523
|
+
isAutoAnswered: true
|
|
524
|
+
}, ['behavioral', 'operational']);
|
|
525
|
+
} catch (error) {
|
|
526
|
+
// Reset isAutoAnswering flag on failure
|
|
527
|
+
task.updateTaskData({
|
|
528
|
+
...task.data,
|
|
529
|
+
isAutoAnswering: false
|
|
530
|
+
});
|
|
531
|
+
_loggerProxy.default.error(`Failed to auto-answer task`, {
|
|
532
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
533
|
+
method: 'handleAutoAnswer',
|
|
534
|
+
interactionId: task.data.interactionId,
|
|
535
|
+
error
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
// Track auto-answer failure
|
|
539
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_FAILED, {
|
|
540
|
+
taskId: task.data.interactionId,
|
|
541
|
+
mediaType: task.data.interaction.mediaType,
|
|
542
|
+
error: error?.message || 'Unknown error',
|
|
543
|
+
isAutoAnswered: false
|
|
544
|
+
}, ['behavioral', 'operational']);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
471
548
|
/**
|
|
472
549
|
* Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal
|
|
473
550
|
* @param task - The task to clean up
|
|
@@ -481,13 +558,13 @@ class TaskManager extends _events.default {
|
|
|
481
558
|
}
|
|
482
559
|
const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';
|
|
483
560
|
const isNew = task.data.interaction.state === 'new';
|
|
484
|
-
const
|
|
561
|
+
const needsWrapUp = task.data.agentsPendingWrapUp?.length > 0;
|
|
485
562
|
|
|
486
563
|
// For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)
|
|
487
564
|
// If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)
|
|
488
565
|
// For non-OUTDIAL: remove if state is 'new'
|
|
489
566
|
// Always remove if secondary EpDn agent
|
|
490
|
-
if (isNew && !(isOutdial &&
|
|
567
|
+
if (isNew && !(isOutdial && needsWrapUp) || (0, _TaskUtils.isSecondaryEpDnAgent)(task.data.interaction)) {
|
|
491
568
|
this.removeTaskFromCollection(task);
|
|
492
569
|
}
|
|
493
570
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_","_MetricsManager","_constants3","_TaskUtils","obj","__esModule","default","TaskManager","EventEmitter","constructor","contact","webCallingService","webSocketManager","taskCollection","metricsManager","MetricsManager","getInstance","registerTaskListeners","registerIncomingCallEvent","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","handleIncomingWebCall","call","currentTask","Object","values","find","task","data","interaction","mediaType","mapCallToTask","getCallId","interactionId","LoggerProxy","log","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_INCOMING_WEB_CALL","emit","TASK_EVENTS","TASK_INCOMING","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","event","payload","JSON","parse","type","CC_TASK_EVENTS","includes","info","REGISTER_TASK_LISTENERS","CC_EVENTS","AGENT_CONTACT","Task","wrapUpRequired","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","state","TASK_HYDRATE","AGENT_CONTACT_RESERVED","isConsulted","loginOption","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","AGENT_OFFER_CONTACT","updateTaskData","TASK_OFFER_CONTACT","AGENT_OUTBOUND_FAILED","trackEvent","METRIC_EVENT_NAMES","TASK_OUTDIAL_FAILED","getCommonTrackingFieldForAQMResponse","taskId","reason","reasonCode","AGENT_CONTACT_ASSIGNED","TASK_ASSIGNED","AGENT_CONTACT_UNASSIGNED","TASK_END","AGENT_CONTACT_OFFER_RONA","AGENT_CONTACT_ASSIGN_FAILED","AGENT_INVITE_FAILED","eventTypeToMetricMap","metricEventName","handleTaskCleanup","TASK_REJECT","CONTACT_ENDED","isSecondaryEpDnAgent","CONTACT_MERGED","handleContactMerged","AGENT_CONTACT_HELD","TASK_HOLD","AGENT_CONTACT_UNHELD","TASK_RESUME","AGENT_VTEAM_TRANSFERRED","AGENT_CTQ_CANCEL_FAILED","TASK_CONSULT_QUEUE_FAILED","AGENT_CONSULT_CREATED","TASK_CONSULT_CREATED","AGENT_OFFER_CONSULT","TASK_OFFER_CONSULT","AGENT_CONSULTING","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","AGENT_CONSULT_FAILED","AGENT_CONSULT_ENDED","removeTaskFromCollection","TASK_CONSULT_END","AGENT_CTQ_CANCELLED","TASK_CONSULT_QUEUE_CANCELLED","AGENT_WRAPUP","AGENT_WRAPPEDUP","cancelAutoWrapupTimer","TASK_WRAPPEDUP","CONTACT_RECORDING_PAUSED","TASK_RECORDING_PAUSED","CONTACT_RECORDING_PAUSE_FAILED","TASK_RECORDING_PAUSE_FAILED","CONTACT_RECORDING_RESUMED","TASK_RECORDING_RESUMED","CONTACT_RECORDING_RESUME_FAILED","TASK_RECORDING_RESUME_FAILED","AGENT_CONSULT_CONFERENCING","TASK_CONFERENCE_ESTABLISHING","AGENT_CONSULT_CONFERENCED","TASK_CONFERENCE_STARTED","AGENT_CONSULT_CONFERENCE_FAILED","TASK_CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","isPrimary","isParticipantInMainInteraction","TASK_CONFERENCE_ENDED","PARTICIPANT_JOINED_CONFERENCE","TASK_PARTICIPANT_JOINED","PARTICIPANT_LEFT_CONFERENCE","checkParticipantNotInInteraction","TASK_PARTICIPANT_LEFT","PARTICIPANT_LEFT_CONFERENCE_FAILED","TASK_PARTICIPANT_LEFT_FAILED","AGENT_CONSULT_CONFERENCE_END_FAILED","TASK_CONFERENCE_END_FAILED","AGENT_CONFERENCE_TRANSFERRED","TASK_CONFERENCE_TRANSFERRED","AGENT_CONFERENCE_TRANSFER_FAILED","TASK_CONFERENCE_TRANSFER_FAILED","PARTICIPANT_POST_CALL_ACTIVITY","TASK_POST_CALL_ACTIVITY","taskData","undefined","warn","UPDATE_TASK_DATA","error","childInteractionId","TASK_MERGED","REMOVE_TASK_FROM_COLLECTION","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","isTerminated","getTask","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {ITask, MEDIA_CHANNEL, TASK_EVENTS, TaskData, TaskId} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS} from './constants';\nimport {CC_EVENTS, CC_TASK_EVENTS, WrapupData} from '../config/types';\nimport {LoginOption} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport Task from '.';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport {\n checkParticipantNotInInteraction,\n getIsConferenceInProgress,\n isParticipantInMainInteraction,\n isPrimary,\n isSecondaryEpDnAgent,\n} from './TaskUtils';\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private metricsManager: MetricsManager;\n private static taskManager;\n private wrapupData: WrapupData;\n private agentId: string;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ) {\n super();\n this.contact = contact;\n this.taskCollection = {};\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.metricsManager = MetricsManager.getInstance();\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) => task.data.interaction.mediaType === 'telephony'\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_INCOMING, currentTask);\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n const payload = JSON.parse(event);\n // Re-emit the task events to the task object\n let task: ITask;\n if (payload.data?.type) {\n if (Object.values(CC_TASK_EVENTS).includes(payload.data.type)) {\n task = this.taskCollection[payload.data.interactionId];\n }\n LoggerProxy.info(`Handling task event ${payload.data?.type}`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n switch (payload.data.type) {\n case CC_EVENTS.AGENT_CONTACT:\n // Case1 : Task is already present in taskCollection\n if (this.taskCollection[payload.data.interactionId]) {\n LoggerProxy.log(`Got AGENT_CONTACT: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n break;\n } else if (!this.taskCollection[payload.data.interactionId]) {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got AGENT_CONTACT : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n // Condition 1: The state is=new i.e it is a incoming task\n if (payload.data.interaction.state === 'new') {\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=new, sending TASK_INCOMING event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else {\n // Condition 2: The state is anything else i.e the task was connected\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=${payload.data.interaction.state}, sending TASK_HYDRATE event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_HYDRATE, task);\n }\n }\n break;\n\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n isConsulted: false,\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n if (\n this.webCallingService.loginOption !== LoginOption.BROWSER ||\n task.data.interaction.mediaType !== MEDIA_CHANNEL.TELEPHONY // for digital channels\n ) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else if (this.call) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n }\n break;\n case CC_EVENTS.AGENT_OFFER_CONTACT:\n // We don't have to emit any event here since this will be result of promise.\n task = this.updateTaskData(task, payload.data);\n LoggerProxy.log(`Agent offer contact received for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_OFFER_CONTACT, task);\n break;\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n task = this.updateTaskData(task, payload.data);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_OUTDIAL_FAILED,\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reasonCode || payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n LoggerProxy.log(`Agent outbound failed for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n task.emit(TASK_EVENTS.TASK_OUTDIAL_FAILED, payload.data.reason ?? 'UNKNOWN_REASON');\n break;\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_ASSIGNED, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n case CC_EVENTS.AGENT_INVITE_FAILED: {\n task = this.updateTaskData(task, payload.data);\n\n const eventTypeToMetricMap: Record<string, keyof typeof METRIC_EVENT_NAMES> = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED]: 'AGENT_CONTACT_ASSIGN_FAILED',\n [CC_EVENTS.AGENT_INVITE_FAILED]: 'AGENT_INVITE_FAILED',\n };\n const metricEventName: keyof typeof METRIC_EVENT_NAMES =\n eventTypeToMetricMap[payload.data.type] || 'AGENT_RONA';\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES[metricEventName],\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_REJECT, payload.data.reason);\n break;\n }\n case CC_EVENTS.CONTACT_ENDED:\n // Update task data\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction.state !== 'new' &&\n !isSecondaryEpDnAgent(payload.data.interaction),\n });\n\n // Handle cleanup based on whether task should be deleted\n this.handleTaskCleanup(task);\n\n task?.emit(TASK_EVENTS.TASK_END, task);\n\n break;\n case CC_EVENTS.CONTACT_MERGED:\n task = this.handleContactMerged(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONTACT_HELD:\n // As soon as the main interaction is held, we need to emit TASK_HOLD\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_HOLD, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n // As soon as the main interaction is unheld, we need to emit TASK_RESUME\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RESUME, task);\n break;\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n // Received when self agent initiates a consult\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: false, // This ensures that the task consult status is always reset\n });\n task.emit(TASK_EVENTS.TASK_CONSULT_CREATED, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CONSULT:\n // Received when other agent sends us a consult offer\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: true, // This ensures that the task is marked as us being requested for a consult\n });\n task.emit(TASK_EVENTS.TASK_OFFER_CONSULT, task);\n break;\n case CC_EVENTS.AGENT_CONSULTING:\n // Received when agent is in an active consult state\n // TODO: Check if we can use backend consult state instead of isConsulted\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // Fire only if you are the agent who received the consult request\n task.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, task);\n } else {\n // Fire only if you are the agent who initiated the consult\n task.emit(TASK_EVENTS.TASK_CONSULTING, task);\n }\n break;\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n // This can only be received by the agent who initiated the consult.\n // We need not emit any event here since this will be result of promise\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONSULT_ENDED:\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // This will be the end state of the task as soon as we end the consult in case of\n // us being offered a consult\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONSULT_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n // This event is received when the consult using queue is cancelled using API\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED, task);\n break;\n case CC_EVENTS.AGENT_WRAPUP:\n task = this.updateTaskData(task, {...payload.data, wrapUpRequired: true});\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_WRAPPEDUP:\n task.cancelAutoWrapupTimer();\n this.removeTaskFromCollection(task);\n task.emit(TASK_EVENTS.TASK_WRAPPEDUP, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSE_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSE_FAILED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUMED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUME_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n // Conference is being established - update task state and emit establishing event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n // Conference started successfully - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n // Conference failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n // Conference ended - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n if (\n !task ||\n isPrimary(task, this.agentId) ||\n isParticipantInMainInteraction(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);\n break;\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {\n // Conference ended - update task state and emit event\n\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n if (checkParticipantNotInInteraction(task, this.agentId)) {\n if (\n isParticipantInMainInteraction(task, this.agentId) ||\n isPrimary(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n }\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:\n // Conference exit failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:\n // Conference end failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n // Conference was transferred - update task state and emit transfer success event\n // Note: Backend should provide hasLeft and wrapUpRequired status\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n // Conference transfer failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);\n break;\n case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:\n // Post-call activity for participant - update task state with activity details\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n break;\n default:\n break;\n }\n if (task) {\n task.emit(payload.data.type, payload.data);\n }\n }\n });\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n return undefined;\n }\n\n if (!taskData?.interactionId) {\n LoggerProxy.warn('Received task update with missing interactionId', {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n });\n }\n\n try {\n const currentTask = task.updateTaskData(taskData);\n this.taskCollection[taskData.interactionId] = currentTask;\n\n return currentTask;\n } catch (error) {\n LoggerProxy.error(`Failed to update task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n interactionId: taskData.interactionId,\n });\n\n return task;\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMerged(task: ITask, taskData: TaskData): ITask {\n if (taskData.childInteractionId) {\n // remove the child task from collection\n this.removeTaskFromCollection(this.taskCollection[taskData.childInteractionId]);\n }\n\n if (this.taskCollection[taskData.interactionId]) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n // update the task data\n task = this.updateTaskData(task, taskData);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...taskData,\n wrapUpRequired: taskData.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(taskData),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[taskData.interactionId] = task;\n }\n\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n\n return task;\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n // Clean up Desktop/WebRTC calling resources for browser-based telephony tasks\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === 'telephony'\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const isTerminated = task.data.interaction.isTerminated;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if ((isNew && !(isOutdial && isTerminated)) || isSecondaryEpDnAgent(task.data.interaction)) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getTask = (taskId: string) => {\n return this.taskCollection[taskId];\n };\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getAllTasks = (): Record<TaskId, ITask> => {\n return this.taskCollection;\n };\n\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n public static getTaskManager = (\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ): TaskManager => {\n if (!this.taskManager) {\n this.taskManager = new TaskManager(contact, webCallingService, webSocketManager);\n }\n\n return this.taskManager;\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_","_MetricsManager","_constants3","_TaskUtils","e","__esModule","default","TaskManager","EventEmitter","constructor","contact","webCallingService","webSocketManager","taskCollection","metricsManager","MetricsManager","getInstance","registerTaskListeners","registerIncomingCallEvent","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","webRtcEnabled","handleIncomingWebCall","call","currentTask","Object","values","find","task","data","interaction","mediaType","mapCallToTask","getCallId","interactionId","LoggerProxy","log","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_INCOMING_WEB_CALL","emit","TASK_EVENTS","TASK_INCOMING","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","event","payload","JSON","parse","type","CC_TASK_EVENTS","includes","info","REGISTER_TASK_LISTENERS","CC_EVENTS","AGENT_CONTACT","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","Task","wrapUpRequired","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","isAutoAnswering","state","TASK_HYDRATE","AGENT_CONTACT_RESERVED","shouldAutoAnswerReserved","isConsulted","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","AGENT_OFFER_CONTACT","updateTaskData","TASK_OFFER_CONTACT","handleAutoAnswer","AGENT_OUTBOUND_FAILED","trackEvent","METRIC_EVENT_NAMES","TASK_OUTDIAL_FAILED","getCommonTrackingFieldForAQMResponse","taskId","reason","reasonCode","AGENT_CONTACT_ASSIGNED","TASK_ASSIGNED","AGENT_CONTACT_UNASSIGNED","TASK_END","AGENT_CONTACT_OFFER_RONA","AGENT_CONTACT_ASSIGN_FAILED","AGENT_INVITE_FAILED","eventTypeToMetricMap","metricEventName","handleTaskCleanup","TASK_REJECT","CONTACT_ENDED","isSecondaryEpDnAgent","CONTACT_MERGED","handleContactMerged","AGENT_CONTACT_HELD","TASK_HOLD","AGENT_CONTACT_UNHELD","TASK_RESUME","AGENT_VTEAM_TRANSFERRED","AGENT_CTQ_CANCEL_FAILED","TASK_CONSULT_QUEUE_FAILED","AGENT_CONSULT_CREATED","TASK_CONSULT_CREATED","AGENT_OFFER_CONSULT","TASK_OFFER_CONSULT","AGENT_CONSULTING","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","AGENT_CONSULT_FAILED","AGENT_CONSULT_ENDED","removeTaskFromCollection","TASK_CONSULT_END","AGENT_CTQ_CANCELLED","TASK_CONSULT_QUEUE_CANCELLED","AGENT_WRAPUP","AGENT_WRAPPEDUP","cancelAutoWrapupTimer","TASK_WRAPPEDUP","CONTACT_RECORDING_PAUSED","TASK_RECORDING_PAUSED","CONTACT_RECORDING_PAUSE_FAILED","TASK_RECORDING_PAUSE_FAILED","CONTACT_RECORDING_RESUMED","TASK_RECORDING_RESUMED","CONTACT_RECORDING_RESUME_FAILED","TASK_RECORDING_RESUME_FAILED","AGENT_CONSULT_CONFERENCING","TASK_CONFERENCE_ESTABLISHING","AGENT_CONSULT_CONFERENCED","TASK_CONFERENCE_STARTED","AGENT_CONSULT_CONFERENCE_FAILED","TASK_CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","isPrimary","isParticipantInMainInteraction","TASK_CONFERENCE_ENDED","PARTICIPANT_JOINED_CONFERENCE","TASK_PARTICIPANT_JOINED","PARTICIPANT_LEFT_CONFERENCE","checkParticipantNotInInteraction","TASK_PARTICIPANT_LEFT","PARTICIPANT_LEFT_CONFERENCE_FAILED","TASK_PARTICIPANT_LEFT_FAILED","AGENT_CONSULT_CONFERENCE_END_FAILED","TASK_CONFERENCE_END_FAILED","AGENT_CONFERENCE_TRANSFERRED","TASK_CONFERENCE_TRANSFERRED","AGENT_CONFERENCE_TRANSFER_FAILED","TASK_CONFERENCE_TRANSFER_FAILED","PARTICIPANT_POST_CALL_ACTIVITY","TASK_POST_CALL_ACTIVITY","taskData","undefined","warn","UPDATE_TASK_DATA","error","childInteractionId","TASK_MERGED","REMOVE_TASK_FROM_COLLECTION","accept","TASK_AUTO_ANSWER_SUCCESS","isAutoAnswered","TASK_AUTO_ANSWER_FAILED","message","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","agentsPendingWrapUp","length","getTask","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {ITask, MEDIA_CHANNEL, TASK_EVENTS, TaskData, TaskId} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS} from './constants';\nimport {CC_EVENTS, CC_TASK_EVENTS, WrapupData} from '../config/types';\nimport {LoginOption} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport Task from '.';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport {\n checkParticipantNotInInteraction,\n getIsConferenceInProgress,\n isParticipantInMainInteraction,\n isPrimary,\n isSecondaryEpDnAgent,\n shouldAutoAnswerTask,\n} from './TaskUtils';\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private metricsManager: MetricsManager;\n private static taskManager;\n private wrapupData: WrapupData;\n private agentId: string;\n private webRtcEnabled: boolean;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ) {\n super();\n this.contact = contact;\n this.taskCollection = {};\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.metricsManager = MetricsManager.getInstance();\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) => task.data.interaction.mediaType === 'telephony'\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_INCOMING, currentTask);\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n const payload = JSON.parse(event);\n // Re-emit the task events to the task object\n let task: ITask;\n if (payload.data?.type) {\n if (Object.values(CC_TASK_EVENTS).includes(payload.data.type)) {\n task = this.taskCollection[payload.data.interactionId];\n }\n LoggerProxy.info(`Handling task event ${payload.data?.type}`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n switch (payload.data.type) {\n case CC_EVENTS.AGENT_CONTACT:\n // Case1 : Task is already present in taskCollection\n if (this.taskCollection[payload.data.interactionId]) {\n LoggerProxy.log(`Got AGENT_CONTACT: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n break;\n } else if (!this.taskCollection[payload.data.interactionId]) {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got AGENT_CONTACT : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n\n // Check if auto-answer should happen for this task\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload.data,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n isAutoAnswering: shouldAutoAnswer, // Set flag before emitting\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n // Condition 1: The state is=new i.e it is a incoming task\n if (payload.data.interaction.state === 'new') {\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=new, sending TASK_INCOMING event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else {\n // Condition 2: The state is anything else i.e the task was connected\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=${payload.data.interaction.state}, sending TASK_HYDRATE event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_HYDRATE, task);\n }\n }\n break;\n\n case CC_EVENTS.AGENT_CONTACT_RESERVED: {\n // Check if auto-answer should happen for this task\n const shouldAutoAnswerReserved = shouldAutoAnswerTask(\n payload.data,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n isConsulted: false,\n isAutoAnswering: shouldAutoAnswerReserved, // Set flag before emitting\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n if (\n this.webCallingService.loginOption !== LoginOption.BROWSER ||\n task.data.interaction.mediaType !== MEDIA_CHANNEL.TELEPHONY // for digital channels\n ) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else if (this.call) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n }\n break;\n }\n case CC_EVENTS.AGENT_OFFER_CONTACT:\n // We don't have to emit any event here since this will be result of promise.\n task = this.updateTaskData(task, payload.data);\n LoggerProxy.log(`Agent offer contact received for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_OFFER_CONTACT, task);\n\n // Handle auto-answer for offer contact\n this.handleAutoAnswer(task);\n break;\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n if (task) {\n task = this.updateTaskData(task, payload.data);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_OUTDIAL_FAILED,\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reasonCode || payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n LoggerProxy.log(`Agent outbound failed for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n task.emit(TASK_EVENTS.TASK_OUTDIAL_FAILED, payload.data.reason ?? 'UNKNOWN_REASON');\n }\n break;\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_ASSIGNED, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n case CC_EVENTS.AGENT_INVITE_FAILED: {\n task = this.updateTaskData(task, payload.data);\n\n const eventTypeToMetricMap: Record<string, keyof typeof METRIC_EVENT_NAMES> = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED]: 'AGENT_CONTACT_ASSIGN_FAILED',\n [CC_EVENTS.AGENT_INVITE_FAILED]: 'AGENT_INVITE_FAILED',\n };\n const metricEventName: keyof typeof METRIC_EVENT_NAMES =\n eventTypeToMetricMap[payload.data.type] || 'AGENT_RONA';\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES[metricEventName],\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_REJECT, payload.data.reason);\n break;\n }\n case CC_EVENTS.CONTACT_ENDED:\n // Update task data\n if (task) {\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction.state !== 'new' &&\n !isSecondaryEpDnAgent(payload.data.interaction),\n });\n\n // Handle cleanup based on whether task should be deleted\n this.handleTaskCleanup(task);\n\n task?.emit(TASK_EVENTS.TASK_END, task);\n }\n break;\n case CC_EVENTS.CONTACT_MERGED:\n task = this.handleContactMerged(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONTACT_HELD:\n // As soon as the main interaction is held, we need to emit TASK_HOLD\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_HOLD, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n // As soon as the main interaction is unheld, we need to emit TASK_RESUME\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RESUME, task);\n break;\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n // Received when self agent initiates a consult\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: false, // This ensures that the task consult status is always reset\n });\n task.emit(TASK_EVENTS.TASK_CONSULT_CREATED, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CONSULT:\n // Received when other agent sends us a consult offer\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: true, // This ensures that the task is marked as us being requested for a consult\n });\n task.emit(TASK_EVENTS.TASK_OFFER_CONSULT, task);\n\n // Handle auto-answer for consult offer\n this.handleAutoAnswer(task);\n break;\n case CC_EVENTS.AGENT_CONSULTING:\n // Received when agent is in an active consult state\n // TODO: Check if we can use backend consult state instead of isConsulted\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // Fire only if you are the agent who received the consult request\n task.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, task);\n } else {\n // Fire only if you are the agent who initiated the consult\n task.emit(TASK_EVENTS.TASK_CONSULTING, task);\n }\n break;\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n // This can only be received by the agent who initiated the consult.\n // We need not emit any event here since this will be result of promise\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONSULT_ENDED:\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // This will be the end state of the task as soon as we end the consult in case of\n // us being offered a consult\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONSULT_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n // This event is received when the consult using queue is cancelled using API\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED, task);\n break;\n case CC_EVENTS.AGENT_WRAPUP:\n task = this.updateTaskData(task, {...payload.data, wrapUpRequired: true});\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_WRAPPEDUP:\n task.cancelAutoWrapupTimer();\n this.removeTaskFromCollection(task);\n task.emit(TASK_EVENTS.TASK_WRAPPEDUP, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSE_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSE_FAILED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUMED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUME_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n // Conference is being established - update task state and emit establishing event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n // Conference started successfully - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n // Conference failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n // Conference ended - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n if (\n !task ||\n isPrimary(task, this.agentId) ||\n isParticipantInMainInteraction(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);\n break;\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {\n // Conference ended - update task state and emit event\n\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n if (checkParticipantNotInInteraction(task, this.agentId)) {\n if (\n isParticipantInMainInteraction(task, this.agentId) ||\n isPrimary(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n }\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:\n // Conference exit failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:\n // Conference end failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n // Conference was transferred - update task state and emit transfer success event\n // Note: Backend should provide hasLeft and wrapUpRequired status\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n // Conference transfer failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);\n break;\n case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:\n // Post-call activity for participant - update task state with activity details\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n break;\n default:\n break;\n }\n if (task) {\n task.emit(payload.data.type, payload.data);\n }\n }\n });\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n return undefined;\n }\n\n if (!taskData?.interactionId) {\n LoggerProxy.warn('Received task update with missing interactionId', {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n });\n }\n\n try {\n const currentTask = task.updateTaskData(taskData);\n this.taskCollection[taskData.interactionId] = currentTask;\n\n return currentTask;\n } catch (error) {\n LoggerProxy.error(`Failed to update task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n interactionId: taskData.interactionId,\n });\n\n return task;\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMerged(task: ITask, taskData: TaskData): ITask {\n if (taskData.childInteractionId) {\n // remove the child task from collection\n this.removeTaskFromCollection(this.taskCollection[taskData.childInteractionId]);\n }\n\n if (this.taskCollection[taskData.interactionId]) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n // update the task data\n task = this.updateTaskData(task, taskData);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...taskData,\n wrapUpRequired: taskData.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(taskData),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[taskData.interactionId] = task;\n }\n\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n\n return task;\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles auto-answer logic for incoming tasks\n * Automatically accepts tasks when isAutoAnswering flag is set\n * The flag is set during task creation based on:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param task - The task to auto-answer\n * @private\n */\n private async handleAutoAnswer(task: ITask): Promise<void> {\n if (!task || !task.data || !task.data.isAutoAnswering) {\n return;\n }\n\n LoggerProxy.info(`Auto-answering task`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n });\n\n try {\n await task.accept();\n LoggerProxy.info(`Task auto-answered successfully`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n });\n\n // Track successful auto-answer\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_SUCCESS,\n {\n taskId: task.data.interactionId,\n mediaType: task.data.interaction.mediaType,\n isAutoAnswered: true,\n },\n ['behavioral', 'operational']\n );\n } catch (error) {\n // Reset isAutoAnswering flag on failure\n task.updateTaskData({...task.data, isAutoAnswering: false});\n LoggerProxy.error(`Failed to auto-answer task`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n error,\n });\n\n // Track auto-answer failure\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_FAILED,\n {\n taskId: task.data.interactionId,\n mediaType: task.data.interaction.mediaType,\n error: error?.message || 'Unknown error',\n isAutoAnswered: false,\n },\n ['behavioral', 'operational']\n );\n }\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n // Clean up Desktop/WebRTC calling resources for browser-based telephony tasks\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === 'telephony'\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const needsWrapUp = task.data.agentsPendingWrapUp?.length > 0;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // If terminated, keep task for wrap-up flow (CONTACT_ENDED → AGENT_WRAPUP)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if ((isNew && !(isOutdial && needsWrapUp)) || isSecondaryEpDnAgent(task.data.interaction)) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getTask = (taskId: string) => {\n return this.taskCollection[taskId];\n };\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getAllTasks = (): Record<TaskId, ITask> => {\n return this.taskCollection;\n };\n\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n public static getTaskManager = (\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ): TaskManager => {\n if (!this.taskManager) {\n this.taskManager = new TaskManager(contact, webCallingService, webSocketManager);\n }\n\n return this.taskManager;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|