@webex/contact-center 3.12.0-next.8 → 3.12.0-next.81
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/AGENTS.md +438 -0
- package/ai-docs/README.md +131 -0
- package/ai-docs/RULES.md +455 -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 +265 -29
- package/dist/cc.js.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +16 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +20 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +101 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +23 -4
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +74 -3
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/UserPreference.js +427 -0
- package/dist/services/UserPreference.js.map +1 -0
- package/dist/services/config/Util.js +3 -3
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +23 -2
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/types.js +49 -9
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +107 -32
- package/dist/services/core/Utils.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 +688 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +45 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +725 -526
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +162 -26
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/constants.js +9 -2
- package/dist/services/task/constants.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 +77 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +837 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +543 -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 +340 -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 +553 -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 +212 -4
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1042 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +149 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/types/cc.d.ts +94 -1
- package/dist/types/config.d.ts +6 -0
- package/dist/types/constants.d.ts +16 -1
- package/dist/types/index.d.ts +21 -6
- package/dist/types/metrics/constants.d.ts +19 -1
- package/dist/types/services/ApiAiAssistant.d.ts +11 -3
- package/dist/types/services/UserPreference.d.ts +118 -0
- package/dist/types/services/config/constants.d.ts +21 -0
- package/dist/types/services/config/types.d.ts +171 -10
- package/dist/types/services/core/Err.d.ts +4 -0
- package/dist/types/services/core/Utils.d.ts +33 -13
- 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 +157 -0
- package/dist/types/services/task/TaskFactory.d.ts +12 -0
- package/dist/types/services/task/TaskUtils.d.ts +46 -2
- package/dist/types/services/task/constants.d.ts +7 -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 +1144 -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 +90 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +267 -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 +603 -66
- package/dist/types/services/task/voice/Voice.d.ts +184 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/types.d.ts +94 -0
- package/dist/types/webex.d.ts +1 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +14 -2
- package/dist/webex.js.map +1 -1
- package/package.json +15 -12
- package/src/cc.ts +329 -30
- package/src/config.ts +6 -0
- package/src/constants.ts +16 -1
- package/src/index.ts +23 -5
- package/src/metrics/ai-docs/AGENTS.md +348 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
- package/src/metrics/behavioral-events.ts +106 -0
- package/src/metrics/constants.ts +23 -4
- package/src/services/ApiAiAssistant.ts +104 -3
- package/src/services/UserPreference.ts +509 -0
- package/src/services/agent/ai-docs/AGENTS.md +238 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
- package/src/services/ai-docs/AGENTS.md +384 -0
- package/src/services/config/Util.ts +3 -3
- package/src/services/config/ai-docs/AGENTS.md +253 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
- package/src/services/config/constants.ts +25 -1
- package/src/services/config/types.ts +174 -11
- package/src/services/core/Err.ts +2 -0
- package/src/services/core/Utils.ts +123 -37
- package/src/services/core/ai-docs/AGENTS.md +379 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +696 -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 +837 -0
- package/src/services/task/TaskFactory.ts +55 -0
- package/src/services/task/TaskManager.ts +738 -613
- package/src/services/task/TaskUtils.ts +205 -25
- package/src/services/task/ai-docs/AGENTS.md +455 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +585 -0
- package/src/services/task/constants.ts +7 -0
- package/src/services/task/dialer.ts +80 -0
- package/src/services/task/digital/Digital.ts +95 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +1077 -0
- package/src/services/task/state-machine/actions.ts +685 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
- package/src/services/task/state-machine/constants.ts +172 -0
- package/src/services/task/state-machine/guards.ts +406 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +241 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +867 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +710 -71
- package/src/services/task/voice/Voice.ts +1267 -0
- package/src/services/task/voice/WebRTC.ts +187 -0
- package/src/types.ts +122 -2
- package/src/utils/AGENTS.md +276 -0
- package/src/webex.js +2 -0
- package/test/unit/spec/cc.ts +343 -23
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +122 -17
- package/test/unit/spec/services/UserPreference.ts +401 -0
- package/test/unit/spec/services/WebCallingService.ts +7 -1
- package/test/unit/spec/services/config/index.ts +30 -30
- package/test/unit/spec/services/core/Utils.ts +425 -8
- 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 +477 -0
- package/test/unit/spec/services/task/TaskFactory.ts +62 -0
- package/test/unit/spec/services/task/TaskManager.ts +832 -1702
- package/test/unit/spec/services/task/TaskUtils.ts +206 -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 +1825 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +479 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2020 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +631 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +235 -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
package/src/cc.ts
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
UploadLogsResponse,
|
|
26
26
|
UpdateDeviceTypeResponse,
|
|
27
27
|
GenericError,
|
|
28
|
+
ConfigFlags,
|
|
28
29
|
} from './types';
|
|
29
30
|
import {
|
|
30
31
|
READY,
|
|
@@ -69,6 +70,7 @@ import {EntryPoint} from './services/EntryPoint';
|
|
|
69
70
|
import {AddressBook} from './services/AddressBook';
|
|
70
71
|
import {Queue} from './services/Queue';
|
|
71
72
|
import {ApiAIAssistant} from './services/ApiAiAssistant';
|
|
73
|
+
import {UserPreference} from './services/UserPreference';
|
|
72
74
|
import type {
|
|
73
75
|
EntryPointListResponse,
|
|
74
76
|
EntryPointSearchParams,
|
|
@@ -325,7 +327,38 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
325
327
|
* });
|
|
326
328
|
* ```
|
|
327
329
|
*/
|
|
328
|
-
|
|
330
|
+
public queue: Queue;
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* API instance for managing Webex Contact Center user preferences
|
|
334
|
+
* Provides functionality to get, create, update, and delete user preferences
|
|
335
|
+
* @type {UserPreference}
|
|
336
|
+
* @public
|
|
337
|
+
* @example
|
|
338
|
+
* ```typescript
|
|
339
|
+
* const cc = webex.cc;
|
|
340
|
+
* await cc.register();
|
|
341
|
+
* await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });
|
|
342
|
+
*
|
|
343
|
+
* // Get user preferences for current user
|
|
344
|
+
* const preferences = await cc.userPreference.getUserPreference();
|
|
345
|
+
*
|
|
346
|
+
* // Create new user preferences
|
|
347
|
+
* const newPrefs = await cc.userPreference.createUserPreference({
|
|
348
|
+
* userId: 'user123',
|
|
349
|
+
* preferences: { e911Reminder: true }
|
|
350
|
+
* });
|
|
351
|
+
*
|
|
352
|
+
* // Update user preferences
|
|
353
|
+
* const updatedPrefs = await cc.userPreference.updateUserPreference('user123', {
|
|
354
|
+
* preferences: { e911Reminder: false }
|
|
355
|
+
* });
|
|
356
|
+
*
|
|
357
|
+
* // Delete user preferences
|
|
358
|
+
* await cc.userPreference.deleteUserPreference('user123');
|
|
359
|
+
* ```
|
|
360
|
+
*/
|
|
361
|
+
public userPreference: UserPreference;
|
|
329
362
|
|
|
330
363
|
/**
|
|
331
364
|
* API instance for AI Assistant operations such as transcript controls.
|
|
@@ -357,6 +390,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
357
390
|
this.$webex.once(READY, () => {
|
|
358
391
|
// @ts-ignore
|
|
359
392
|
this.$config = this.config;
|
|
393
|
+
this.validatePluginConfig();
|
|
360
394
|
|
|
361
395
|
/**
|
|
362
396
|
* This is used for handling the async requests by sending webex.request and wait for corresponding websocket event.
|
|
@@ -369,7 +403,6 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
369
403
|
webex: this.$webex,
|
|
370
404
|
connectionConfig: this.getConnectionConfig(),
|
|
371
405
|
});
|
|
372
|
-
this.services.webSocketManager.on('message', this.handleWebsocketMessage);
|
|
373
406
|
|
|
374
407
|
this.webCallingService = new WebCallingService(this.$webex);
|
|
375
408
|
this.apiAIAssistant = new ApiAIAssistant(this.$webex);
|
|
@@ -378,7 +411,8 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
378
411
|
this.apiAIAssistant,
|
|
379
412
|
this.services.contact,
|
|
380
413
|
this.webCallingService,
|
|
381
|
-
this.services.webSocketManager
|
|
414
|
+
this.services.webSocketManager,
|
|
415
|
+
this.services.rtdWebSocketManager
|
|
382
416
|
);
|
|
383
417
|
this.incomingTaskListener();
|
|
384
418
|
|
|
@@ -387,6 +421,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
387
421
|
this.entryPoint = new EntryPoint(this.$webex);
|
|
388
422
|
this.addressBook = new AddressBook(this.$webex, () => this.agentConfig?.addressBookId);
|
|
389
423
|
this.queue = new Queue(this.$webex);
|
|
424
|
+
this.userPreference = new UserPreference(this.$webex, () => this.agentConfig?.agentId);
|
|
390
425
|
LoggerProxy.initialize(this.$webex.logger);
|
|
391
426
|
});
|
|
392
427
|
}
|
|
@@ -411,6 +446,16 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
411
446
|
this.trigger(TASK_EVENTS.TASK_HYDRATE, task);
|
|
412
447
|
};
|
|
413
448
|
|
|
449
|
+
/**
|
|
450
|
+
* Handles multi-login hydrate events for SDK instances without Mobius registration
|
|
451
|
+
* @private
|
|
452
|
+
* @param {ITask} task The task object associated with the multi-login hydrate
|
|
453
|
+
*/
|
|
454
|
+
private handleTaskMultiLoginHydrate = (task: ITask) => {
|
|
455
|
+
// @ts-ignore
|
|
456
|
+
this.trigger(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, task);
|
|
457
|
+
};
|
|
458
|
+
|
|
414
459
|
/**
|
|
415
460
|
* Handles task merged events when tasks are combined eg: EPDN merge/transfer
|
|
416
461
|
* @private
|
|
@@ -431,8 +476,8 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
431
476
|
this.trigger(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, task);
|
|
432
477
|
};
|
|
433
478
|
|
|
434
|
-
private handleRTDWebsocketMessage = (
|
|
435
|
-
this.taskManager.handleRealtimeWebsocketEvent(
|
|
479
|
+
private handleRTDWebsocketMessage = (event: string) => {
|
|
480
|
+
this.taskManager.handleRealtimeWebsocketEvent(event);
|
|
436
481
|
};
|
|
437
482
|
|
|
438
483
|
/**
|
|
@@ -443,6 +488,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
443
488
|
private incomingTaskListener() {
|
|
444
489
|
this.taskManager.on(TASK_EVENTS.TASK_INCOMING, this.handleIncomingTask);
|
|
445
490
|
this.taskManager.on(TASK_EVENTS.TASK_HYDRATE, this.handleTaskHydrate);
|
|
491
|
+
this.taskManager.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this.handleTaskMultiLoginHydrate);
|
|
446
492
|
this.taskManager.on(TASK_EVENTS.TASK_MERGED, this.handleTaskMerged);
|
|
447
493
|
this.taskManager.on(
|
|
448
494
|
TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION,
|
|
@@ -487,7 +533,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
487
533
|
* ```
|
|
488
534
|
*/
|
|
489
535
|
public async register(): Promise<Profile> {
|
|
490
|
-
LoggerProxy.
|
|
536
|
+
LoggerProxy.log('Starting CC SDK registration', {
|
|
491
537
|
module: CC_FILE,
|
|
492
538
|
method: METHODS.REGISTER,
|
|
493
539
|
});
|
|
@@ -497,6 +543,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
497
543
|
METRIC_EVENT_NAMES.WEBSOCKET_REGISTER_FAILED,
|
|
498
544
|
]);
|
|
499
545
|
this.setupEventListeners();
|
|
546
|
+
this.services.webSocketManager.on('message', this.handleWebsocketMessage);
|
|
500
547
|
|
|
501
548
|
const resp = await this.connectWebsocket();
|
|
502
549
|
// Ensure 'dn' is always populated from 'defaultDn'
|
|
@@ -576,6 +623,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
576
623
|
|
|
577
624
|
this.taskManager.off(TASK_EVENTS.TASK_INCOMING, this.handleIncomingTask);
|
|
578
625
|
this.taskManager.off(TASK_EVENTS.TASK_HYDRATE, this.handleTaskHydrate);
|
|
626
|
+
this.taskManager.off(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, this.handleTaskMultiLoginHydrate);
|
|
579
627
|
this.taskManager.off(
|
|
580
628
|
TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION,
|
|
581
629
|
this.handleCampaignPreviewReservation
|
|
@@ -606,6 +654,9 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
606
654
|
if (!this.services.webSocketManager.isSocketClosed) {
|
|
607
655
|
this.services.webSocketManager.close(false, 'Unregistering the SDK');
|
|
608
656
|
}
|
|
657
|
+
if (this.services.rtdWebSocketManager && !this.services.rtdWebSocketManager.isSocketClosed) {
|
|
658
|
+
this.services.rtdWebSocketManager.close(false, 'Unregistering the SDK');
|
|
659
|
+
}
|
|
609
660
|
|
|
610
661
|
if (this.services.rtdWebSocketManager && !this.services.rtdWebSocketManager.isSocketClosed) {
|
|
611
662
|
this.services.rtdWebSocketManager.close(false, 'Unregistering the RTD websocket');
|
|
@@ -731,7 +782,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
731
782
|
* @private
|
|
732
783
|
*/
|
|
733
784
|
private async connectWebsocket() {
|
|
734
|
-
LoggerProxy.
|
|
785
|
+
LoggerProxy.log('Connecting to websocket', {
|
|
735
786
|
module: CC_FILE,
|
|
736
787
|
method: METHODS.CONNECT_WEBSOCKET,
|
|
737
788
|
});
|
|
@@ -751,19 +802,34 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
751
802
|
method: METHODS.CONNECT_WEBSOCKET,
|
|
752
803
|
});
|
|
753
804
|
|
|
805
|
+
const configFlags: ConfigFlags = {
|
|
806
|
+
isEndTaskEnabled: this.agentConfig.isEndTaskEnabled,
|
|
807
|
+
isEndConsultEnabled: this.agentConfig.isEndConsultEnabled,
|
|
808
|
+
webRtcEnabled: this.agentConfig.webRtcEnabled,
|
|
809
|
+
autoWrapup: this.agentConfig.wrapUpData?.wrapUpProps?.autoWrapup ?? false,
|
|
810
|
+
aiFeature: this.agentConfig.aiFeature,
|
|
811
|
+
};
|
|
812
|
+
this.taskManager.setConfigFlags(configFlags);
|
|
754
813
|
// TODO: Make profile a singleton to make it available throughout app/sdk so we dont need to inject info everywhere
|
|
755
814
|
this.taskManager.setWrapupData(this.agentConfig.wrapUpData);
|
|
756
815
|
this.taskManager.setAgentId(this.agentConfig.agentId);
|
|
757
816
|
this.taskManager.setWebRtcEnabled(this.agentConfig.webRtcEnabled);
|
|
758
817
|
this.apiAIAssistant.setAIFeatureFlags(this.agentConfig.aiFeature);
|
|
759
818
|
|
|
760
|
-
|
|
819
|
+
/**
|
|
820
|
+
* RTD websocket currently supports realtime transcripts and suggested responses.
|
|
821
|
+
* Extend this condition when additional AI RTD features are introduced.
|
|
822
|
+
*/
|
|
823
|
+
if (
|
|
824
|
+
this.agentConfig.aiFeature?.realtimeTranscripts?.enable ||
|
|
825
|
+
this.agentConfig.aiFeature?.suggestedResponses?.enable
|
|
826
|
+
) {
|
|
761
827
|
LoggerProxy.info('Connecting to RTD websocket', {
|
|
762
828
|
module: CC_FILE,
|
|
763
829
|
method: METHODS.CONNECT_WEBSOCKET,
|
|
764
830
|
});
|
|
765
831
|
|
|
766
|
-
|
|
832
|
+
this.services.rtdWebSocketManager
|
|
767
833
|
.initWebSocket({
|
|
768
834
|
body: this.getConnectionConfig(),
|
|
769
835
|
resource: RTD_SUBSCRIBE_API,
|
|
@@ -776,7 +842,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
776
842
|
this.services.rtdWebSocketManager.on('message', this.handleRTDWebsocketMessage);
|
|
777
843
|
})
|
|
778
844
|
.catch((error) => {
|
|
779
|
-
LoggerProxy.error(`Error
|
|
845
|
+
LoggerProxy.error(`Error connecting to RTD websocket ${error}`, {
|
|
780
846
|
module: CC_FILE,
|
|
781
847
|
method: METHODS.CONNECT_WEBSOCKET,
|
|
782
848
|
});
|
|
@@ -785,7 +851,8 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
785
851
|
|
|
786
852
|
if (
|
|
787
853
|
this.agentConfig.webRtcEnabled &&
|
|
788
|
-
this.agentConfig.loginVoiceOptions.includes(LoginOption.BROWSER)
|
|
854
|
+
this.agentConfig.loginVoiceOptions.includes(LoginOption.BROWSER) &&
|
|
855
|
+
!this.isWebRTCRegistrationDisabled()
|
|
789
856
|
) {
|
|
790
857
|
try {
|
|
791
858
|
await this.$webex.internal.mercury.connect();
|
|
@@ -799,10 +866,23 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
799
866
|
method: METHODS.CONNECT_WEBSOCKET,
|
|
800
867
|
});
|
|
801
868
|
}
|
|
869
|
+
} else if (this.isWebRTCRegistrationDisabled()) {
|
|
870
|
+
LoggerProxy.info(
|
|
871
|
+
'Skipping Mobius registration because disableWebRTCRegistration is enabled',
|
|
872
|
+
{
|
|
873
|
+
module: CC_FILE,
|
|
874
|
+
method: METHODS.CONNECT_WEBSOCKET,
|
|
875
|
+
}
|
|
876
|
+
);
|
|
802
877
|
}
|
|
803
878
|
|
|
804
879
|
if (this.$config && this.$config.allowAutomatedRelogin) {
|
|
805
880
|
await this.silentRelogin();
|
|
881
|
+
} else {
|
|
882
|
+
LoggerProxy.log('Skipping silent relogin: allowAutomatedRelogin is disabled', {
|
|
883
|
+
module: CC_FILE,
|
|
884
|
+
method: METHODS.CONNECT_WEBSOCKET,
|
|
885
|
+
});
|
|
806
886
|
}
|
|
807
887
|
|
|
808
888
|
return this.agentConfig;
|
|
@@ -845,26 +925,37 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
845
925
|
* ```
|
|
846
926
|
*/
|
|
847
927
|
public async stationLogin(data: AgentLogin): Promise<StationLoginResponse> {
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
method: METHODS.STATION_LOGIN,
|
|
851
|
-
});
|
|
928
|
+
const loggerContext = {module: CC_FILE, method: METHODS.STATION_LOGIN};
|
|
929
|
+
|
|
852
930
|
try {
|
|
931
|
+
LoggerProxy.log(
|
|
932
|
+
`Starting agent station login | loginOption: ${data?.loginOption} teamId: ${data?.teamId}`,
|
|
933
|
+
loggerContext
|
|
934
|
+
);
|
|
853
935
|
this.metricsManager.timeEvent([
|
|
854
936
|
METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS,
|
|
855
937
|
METRIC_EVENT_NAMES.STATION_LOGIN_FAILED,
|
|
856
938
|
]);
|
|
857
939
|
|
|
858
940
|
const dialPlanEntries = this.agentConfig?.dialPlan?.dialPlanEntity ?? [];
|
|
859
|
-
if (
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
941
|
+
if (data.loginOption === LoginOption.AGENT_DN) {
|
|
942
|
+
LoggerProxy.log(
|
|
943
|
+
`Validating dial number | dialPlanEnabled: ${!!this.agentConfig
|
|
944
|
+
?.dialPlan} | dialPlanEntryCount: ${dialPlanEntries.length}`,
|
|
945
|
+
loggerContext
|
|
946
|
+
);
|
|
947
|
+
|
|
948
|
+
if (!isValidDialNumber(data.dialNumber, dialPlanEntries)) {
|
|
949
|
+
LoggerProxy.log(
|
|
950
|
+
`Dial number validation failed | dialNumber: ${data.dialNumber} | dialPlanEntryCount: ${dialPlanEntries.length}`,
|
|
951
|
+
loggerContext
|
|
952
|
+
);
|
|
953
|
+
const error = new Error('INVALID_DIAL_NUMBER');
|
|
954
|
+
// @ts-ignore - adding custom key to the error object
|
|
955
|
+
error.details = {data: {reason: 'INVALID_DIAL_NUMBER'}} as Failure;
|
|
866
956
|
|
|
867
|
-
|
|
957
|
+
throw error;
|
|
958
|
+
}
|
|
868
959
|
}
|
|
869
960
|
|
|
870
961
|
const loginResponse = await this.services.agent.stationLogin({
|
|
@@ -883,8 +974,24 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
883
974
|
},
|
|
884
975
|
});
|
|
885
976
|
|
|
886
|
-
if (
|
|
977
|
+
if (
|
|
978
|
+
this.agentConfig.webRtcEnabled &&
|
|
979
|
+
data.loginOption === LoginOption.BROWSER &&
|
|
980
|
+
!this.isWebRTCRegistrationDisabled()
|
|
981
|
+
) {
|
|
887
982
|
await this.webCallingService.registerWebCallingLine();
|
|
983
|
+
} else if (
|
|
984
|
+
this.agentConfig.webRtcEnabled &&
|
|
985
|
+
data.loginOption === LoginOption.BROWSER &&
|
|
986
|
+
this.isWebRTCRegistrationDisabled()
|
|
987
|
+
) {
|
|
988
|
+
LoggerProxy.info(
|
|
989
|
+
'Skipping web calling line registration because disableWebRTCRegistration is enabled',
|
|
990
|
+
{
|
|
991
|
+
module: CC_FILE,
|
|
992
|
+
method: METHODS.STATION_LOGIN,
|
|
993
|
+
}
|
|
994
|
+
);
|
|
888
995
|
}
|
|
889
996
|
|
|
890
997
|
const resp = await loginResponse;
|
|
@@ -1246,6 +1353,30 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1246
1353
|
}
|
|
1247
1354
|
};
|
|
1248
1355
|
|
|
1356
|
+
/**
|
|
1357
|
+
* Checks whether Mobius/WebRTC registration should be skipped by config
|
|
1358
|
+
* @returns {boolean} True when browser WebRTC registration is disabled
|
|
1359
|
+
* @private
|
|
1360
|
+
*/
|
|
1361
|
+
private isWebRTCRegistrationDisabled(): boolean {
|
|
1362
|
+
return this.$config?.disableWebRTCRegistration === true;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
/**
|
|
1366
|
+
* Validates contact-center plugin configuration before service initialization
|
|
1367
|
+
* @private
|
|
1368
|
+
*/
|
|
1369
|
+
private validatePluginConfig(): void {
|
|
1370
|
+
if (
|
|
1371
|
+
this.$config?.disableWebRTCRegistration === true &&
|
|
1372
|
+
this.$config?.allowMultiLogin === false
|
|
1373
|
+
) {
|
|
1374
|
+
throw new Error(
|
|
1375
|
+
'Invalid Contact Center configuration: disableWebRTCRegistration cannot be true when allowMultiLogin is false. Enable allowMultiLogin or allow WebRTC registration so an SDK instance can receive Mobius/WebRTC task events.'
|
|
1376
|
+
);
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1249
1380
|
/**
|
|
1250
1381
|
* Initializes event listeners for the Contact Center service
|
|
1251
1382
|
* Sets up handlers for connection state changes and other core events
|
|
@@ -1277,13 +1408,13 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1277
1408
|
private async handleConnectionLost(msg: ConnectionLostDetails): Promise<void> {
|
|
1278
1409
|
if (msg.isConnectionLost) {
|
|
1279
1410
|
// TODO: Emit an event saying connection is lost
|
|
1280
|
-
LoggerProxy.
|
|
1411
|
+
LoggerProxy.log('event=handleConnectionLost | Connection lost', {
|
|
1281
1412
|
module: CC_FILE,
|
|
1282
1413
|
method: METHODS.HANDLE_CONNECTION_LOST,
|
|
1283
1414
|
});
|
|
1284
1415
|
} else if (msg.isSocketReconnected) {
|
|
1285
1416
|
// TODO: Emit an event saying connection is re-estabilished
|
|
1286
|
-
LoggerProxy.
|
|
1417
|
+
LoggerProxy.log(
|
|
1287
1418
|
'event=handleConnectionReconnect | Connection reconnected attempting to request silent relogin',
|
|
1288
1419
|
{module: CC_FILE, method: METHODS.HANDLE_CONNECTION_LOST}
|
|
1289
1420
|
);
|
|
@@ -1298,7 +1429,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1298
1429
|
* @private
|
|
1299
1430
|
*/
|
|
1300
1431
|
private async silentRelogin(): Promise<void> {
|
|
1301
|
-
LoggerProxy.
|
|
1432
|
+
LoggerProxy.log('Starting silent relogin process', {
|
|
1302
1433
|
module: CC_FILE,
|
|
1303
1434
|
method: METHODS.SILENT_RELOGIN,
|
|
1304
1435
|
});
|
|
@@ -1320,7 +1451,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1320
1451
|
await this.handleDeviceType(deviceType as LoginOption, dn);
|
|
1321
1452
|
|
|
1322
1453
|
if (lastStateChangeReason === 'agent-wss-disconnect') {
|
|
1323
|
-
LoggerProxy.
|
|
1454
|
+
LoggerProxy.log(
|
|
1324
1455
|
'event=requestAutoStateChange | Requesting state change to available on socket reconnect',
|
|
1325
1456
|
{module: CC_FILE, method: METHODS.SILENT_RELOGIN}
|
|
1326
1457
|
);
|
|
@@ -1349,8 +1480,6 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1349
1480
|
}
|
|
1350
1481
|
this.agentConfig.lastStateAuxCodeId = auxCodeId;
|
|
1351
1482
|
this.agentConfig.isAgentLoggedIn = true;
|
|
1352
|
-
// TODO: https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-626777 Implement the de-register method and close the listener there
|
|
1353
|
-
this.services.webSocketManager.on('message', this.handleWebsocketMessage);
|
|
1354
1483
|
|
|
1355
1484
|
LoggerProxy.log(
|
|
1356
1485
|
`Silent relogin process completed successfully with login Option: ${reLoginResponse.data.deviceType} teamId: ${reLoginResponse.data.teamId}`,
|
|
@@ -1391,6 +1520,16 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1391
1520
|
this.agentConfig.deviceType = deviceType;
|
|
1392
1521
|
switch (deviceType) {
|
|
1393
1522
|
case LoginOption.BROWSER:
|
|
1523
|
+
if (this.isWebRTCRegistrationDisabled()) {
|
|
1524
|
+
LoggerProxy.info(
|
|
1525
|
+
'Skipping web calling line registration because disableWebRTCRegistration is enabled',
|
|
1526
|
+
{
|
|
1527
|
+
module: CC_FILE,
|
|
1528
|
+
method: METHODS.HANDLE_DEVICE_TYPE,
|
|
1529
|
+
}
|
|
1530
|
+
);
|
|
1531
|
+
break;
|
|
1532
|
+
}
|
|
1394
1533
|
try {
|
|
1395
1534
|
await this.webCallingService.registerWebCallingLine();
|
|
1396
1535
|
} catch (error) {
|
|
@@ -1656,6 +1795,166 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter
|
|
|
1656
1795
|
}
|
|
1657
1796
|
}
|
|
1658
1797
|
|
|
1798
|
+
/**
|
|
1799
|
+
* Skips a campaign preview contact, requesting the next contact from the campaign.
|
|
1800
|
+
*
|
|
1801
|
+
* When a campaign manager reserves a contact for an agent, the agent receives an
|
|
1802
|
+
* `AgentOfferCampaignReservation` event. Instead of accepting, the agent can skip the
|
|
1803
|
+
* preview contact to move to the next contact in the campaign.
|
|
1804
|
+
*
|
|
1805
|
+
* @param {PreviewContactPayload} payload - The preview contact payload containing interactionId and campaignId (campaign name, not UUID).
|
|
1806
|
+
* @returns {Promise<TaskResponse>} Promise resolving with agent contact on success.
|
|
1807
|
+
* @throws {Error} If the operation fails (network error, etc.)
|
|
1808
|
+
*
|
|
1809
|
+
* @example
|
|
1810
|
+
* ```typescript
|
|
1811
|
+
* webex.cc.on('task:campaignPreviewReservation', async (task) => {
|
|
1812
|
+
* const { interactionId } = task.data;
|
|
1813
|
+
* const campaignId = task.data.interaction.callProcessingDetails.campaignId;
|
|
1814
|
+
*
|
|
1815
|
+
* const result = await webex.cc.skipPreviewContact({ interactionId, campaignId });
|
|
1816
|
+
* });
|
|
1817
|
+
* ```
|
|
1818
|
+
*/
|
|
1819
|
+
public async skipPreviewContact(payload: PreviewContactPayload): Promise<TaskResponse> {
|
|
1820
|
+
const task = this.taskManager.getTask(payload.interactionId);
|
|
1821
|
+
if (task?.data?.interaction?.callProcessingDetails?.campaignPreviewSkipDisabled === 'true') {
|
|
1822
|
+
LoggerProxy.warn('Skip action is disabled for this campaign preview contact', {
|
|
1823
|
+
module: CC_FILE,
|
|
1824
|
+
method: METHODS.SKIP_PREVIEW_CONTACT,
|
|
1825
|
+
interactionId: payload.interactionId,
|
|
1826
|
+
});
|
|
1827
|
+
throw new Error('Skip action is disabled for this campaign preview contact');
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1830
|
+
LoggerProxy.info('Skipping campaign preview contact', {
|
|
1831
|
+
module: CC_FILE,
|
|
1832
|
+
method: METHODS.SKIP_PREVIEW_CONTACT,
|
|
1833
|
+
});
|
|
1834
|
+
try {
|
|
1835
|
+
this.metricsManager.timeEvent([
|
|
1836
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_SUCCESS,
|
|
1837
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_FAILED,
|
|
1838
|
+
]);
|
|
1839
|
+
|
|
1840
|
+
const result = await this.services.dialer.skipPreviewContact({data: payload});
|
|
1841
|
+
|
|
1842
|
+
this.metricsManager.trackEvent(
|
|
1843
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_SUCCESS,
|
|
1844
|
+
{
|
|
1845
|
+
...MetricsManager.getCommonTrackingFieldForAQMResponse(result),
|
|
1846
|
+
interactionId: payload.interactionId,
|
|
1847
|
+
campaignId: payload.campaignId,
|
|
1848
|
+
},
|
|
1849
|
+
['behavioral', 'business', 'operational']
|
|
1850
|
+
);
|
|
1851
|
+
|
|
1852
|
+
LoggerProxy.log('Campaign preview contact skipped successfully', {
|
|
1853
|
+
module: CC_FILE,
|
|
1854
|
+
method: METHODS.SKIP_PREVIEW_CONTACT,
|
|
1855
|
+
trackingId: result.trackingId,
|
|
1856
|
+
interactionId: payload.interactionId,
|
|
1857
|
+
});
|
|
1858
|
+
|
|
1859
|
+
return result;
|
|
1860
|
+
} catch (error) {
|
|
1861
|
+
const failure = error.details as Failure;
|
|
1862
|
+
this.metricsManager.trackEvent(
|
|
1863
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_SKIP_FAILED,
|
|
1864
|
+
{
|
|
1865
|
+
...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(failure),
|
|
1866
|
+
interactionId: payload.interactionId,
|
|
1867
|
+
campaignId: payload.campaignId,
|
|
1868
|
+
},
|
|
1869
|
+
['behavioral', 'business', 'operational']
|
|
1870
|
+
);
|
|
1871
|
+
const {error: detailedError} = getErrorDetails(error, METHODS.SKIP_PREVIEW_CONTACT, CC_FILE);
|
|
1872
|
+
throw detailedError;
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
|
|
1876
|
+
/**
|
|
1877
|
+
* Removes a campaign preview contact from the campaign list entirely.
|
|
1878
|
+
*
|
|
1879
|
+
* When a campaign manager reserves a contact for an agent, the agent receives an
|
|
1880
|
+
* `AgentOfferCampaignReservation` event. Instead of accepting or skipping, the agent can
|
|
1881
|
+
* remove the preview contact to permanently take it out of the campaign contact list.
|
|
1882
|
+
*
|
|
1883
|
+
* @param {PreviewContactPayload} payload - The preview contact payload containing interactionId and campaignId (campaign name, not UUID).
|
|
1884
|
+
* @returns {Promise<TaskResponse>} Promise resolving with agent contact on success.
|
|
1885
|
+
* @throws {Error} If the operation fails (network error, etc.)
|
|
1886
|
+
*
|
|
1887
|
+
* @example
|
|
1888
|
+
* ```typescript
|
|
1889
|
+
* webex.cc.on('task:campaignPreviewReservation', async (task) => {
|
|
1890
|
+
* const { interactionId } = task.data;
|
|
1891
|
+
* const campaignId = task.data.interaction.callProcessingDetails.campaignId;
|
|
1892
|
+
*
|
|
1893
|
+
* const result = await webex.cc.removePreviewContact({ interactionId, campaignId });
|
|
1894
|
+
* });
|
|
1895
|
+
* ```
|
|
1896
|
+
*/
|
|
1897
|
+
public async removePreviewContact(payload: PreviewContactPayload): Promise<TaskResponse> {
|
|
1898
|
+
const task = this.taskManager.getTask(payload.interactionId);
|
|
1899
|
+
if (task?.data?.interaction?.callProcessingDetails?.campaignPreviewRemoveDisabled === 'true') {
|
|
1900
|
+
LoggerProxy.warn('Remove action is disabled for this campaign preview contact', {
|
|
1901
|
+
module: CC_FILE,
|
|
1902
|
+
method: METHODS.REMOVE_PREVIEW_CONTACT,
|
|
1903
|
+
interactionId: payload.interactionId,
|
|
1904
|
+
});
|
|
1905
|
+
throw new Error('Remove action is disabled for this campaign preview contact');
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1908
|
+
LoggerProxy.info('Removing campaign preview contact', {
|
|
1909
|
+
module: CC_FILE,
|
|
1910
|
+
method: METHODS.REMOVE_PREVIEW_CONTACT,
|
|
1911
|
+
});
|
|
1912
|
+
try {
|
|
1913
|
+
this.metricsManager.timeEvent([
|
|
1914
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_SUCCESS,
|
|
1915
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_FAILED,
|
|
1916
|
+
]);
|
|
1917
|
+
|
|
1918
|
+
const result = await this.services.dialer.removePreviewContact({data: payload});
|
|
1919
|
+
|
|
1920
|
+
this.metricsManager.trackEvent(
|
|
1921
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_SUCCESS,
|
|
1922
|
+
{
|
|
1923
|
+
...MetricsManager.getCommonTrackingFieldForAQMResponse(result),
|
|
1924
|
+
interactionId: payload.interactionId,
|
|
1925
|
+
campaignId: payload.campaignId,
|
|
1926
|
+
},
|
|
1927
|
+
['behavioral', 'business', 'operational']
|
|
1928
|
+
);
|
|
1929
|
+
|
|
1930
|
+
LoggerProxy.log('Campaign preview contact removed successfully', {
|
|
1931
|
+
module: CC_FILE,
|
|
1932
|
+
method: METHODS.REMOVE_PREVIEW_CONTACT,
|
|
1933
|
+
trackingId: result.trackingId,
|
|
1934
|
+
interactionId: payload.interactionId,
|
|
1935
|
+
});
|
|
1936
|
+
|
|
1937
|
+
return result;
|
|
1938
|
+
} catch (error) {
|
|
1939
|
+
const failure = error.details as Failure;
|
|
1940
|
+
this.metricsManager.trackEvent(
|
|
1941
|
+
METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_REMOVE_FAILED,
|
|
1942
|
+
{
|
|
1943
|
+
...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(failure),
|
|
1944
|
+
interactionId: payload.interactionId,
|
|
1945
|
+
campaignId: payload.campaignId,
|
|
1946
|
+
},
|
|
1947
|
+
['behavioral', 'business', 'operational']
|
|
1948
|
+
);
|
|
1949
|
+
const {error: detailedError} = getErrorDetails(
|
|
1950
|
+
error,
|
|
1951
|
+
METHODS.REMOVE_PREVIEW_CONTACT,
|
|
1952
|
+
CC_FILE
|
|
1953
|
+
);
|
|
1954
|
+
throw detailedError;
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
|
|
1659
1958
|
/**
|
|
1660
1959
|
* Fetches outdial ANI (Automatic Number Identification) entries for an outdial ANI ID.
|
|
1661
1960
|
*
|
package/src/config.ts
CHANGED
|
@@ -25,6 +25,12 @@ export default {
|
|
|
25
25
|
* @default true
|
|
26
26
|
*/
|
|
27
27
|
allowAutomatedRelogin: true,
|
|
28
|
+
/**
|
|
29
|
+
* Whether to skip Mobius/WebRTC registration for browser login flows.
|
|
30
|
+
* @type {boolean}
|
|
31
|
+
* @default false
|
|
32
|
+
*/
|
|
33
|
+
disableWebRTCRegistration: false,
|
|
28
34
|
/**
|
|
29
35
|
* The type of client making the connection.
|
|
30
36
|
* @type {string}
|
package/src/constants.ts
CHANGED
|
@@ -42,15 +42,30 @@ export const METHODS = {
|
|
|
42
42
|
HANDLE_DEVICE_TYPE: 'handleDeviceType',
|
|
43
43
|
START_OUTDIAL: 'startOutdial',
|
|
44
44
|
GET_QUEUES: 'getQueues',
|
|
45
|
-
GET_OUTDIAL_ANI_ENTRIES: 'getOutdialAniEntries',
|
|
46
45
|
UPLOAD_LOGS: 'uploadLogs',
|
|
47
46
|
UPDATE_AGENT_PROFILE: 'updateAgentProfile',
|
|
48
47
|
GET_DEVICE_ID: 'getDeviceId',
|
|
49
48
|
HANDLE_INCOMING_TASK: 'handleIncomingTask',
|
|
50
49
|
HANDLE_TASK_HYDRATE: 'handleTaskHydrate',
|
|
51
50
|
INCOMING_TASK_LISTENER: 'incomingTaskListener',
|
|
51
|
+
ACCEPT: 'accept',
|
|
52
|
+
REJECT: 'decline',
|
|
53
|
+
HOLD: 'hold',
|
|
54
|
+
RESUME: 'resume',
|
|
55
|
+
HOLD_RESUME: 'holdResume',
|
|
56
|
+
TRANSFER_CALL: 'transfer',
|
|
57
|
+
CONSULT_TRANSFER: 'consultTransfer',
|
|
58
|
+
CONSULT_CONFERENCE: 'consultConference',
|
|
59
|
+
EXIT_CONFERENCE: 'exitConference',
|
|
60
|
+
TRANSFER_CONFERENCE: 'transferConference',
|
|
61
|
+
TOGGLE_MUTE: 'toggleMute',
|
|
62
|
+
COMPLETE_TRANSFER: 'completeTransfer',
|
|
63
|
+
GET_OUTDIAL_ANI_ENTRIES: 'getOutdialAniEntries',
|
|
52
64
|
ACCEPT_PREVIEW_CONTACT: 'acceptPreviewContact',
|
|
65
|
+
SKIP_PREVIEW_CONTACT: 'skipPreviewContact',
|
|
66
|
+
REMOVE_PREVIEW_CONTACT: 'removePreviewContact',
|
|
53
67
|
GET_BASE_URL: 'getBaseUrl',
|
|
54
68
|
SEND_EVENT: 'sendEvent',
|
|
69
|
+
GET_SUGGESTED_RESPONSE: 'getSuggestedResponse',
|
|
55
70
|
FETCH_HISTORIC_TRANSCRIPTS: 'fetchHistoricTranscripts',
|
|
56
71
|
};
|
package/src/index.ts
CHANGED
|
@@ -13,22 +13,22 @@ import ContactCenter from './cc';
|
|
|
13
13
|
*/
|
|
14
14
|
export {default as ContactCenter} from './cc';
|
|
15
15
|
|
|
16
|
-
// Service exports
|
|
17
16
|
/**
|
|
18
|
-
*
|
|
17
|
+
* Agent routing service for Contact Center operations
|
|
19
18
|
* @category Services
|
|
20
19
|
*/
|
|
21
|
-
export {default as
|
|
20
|
+
export {default as routingAgent} from './services/agent';
|
|
22
21
|
|
|
23
22
|
/**
|
|
24
|
-
*
|
|
23
|
+
* Task class represents a contact center task that can be managed by an agent
|
|
25
24
|
* @category Services
|
|
26
25
|
*/
|
|
27
|
-
export {default as
|
|
26
|
+
export {default as Task} from './services/task/Task';
|
|
28
27
|
|
|
29
28
|
// API exports (AddressBook is public, EntryPoint and Queue are accessed via cc wrappers)
|
|
30
29
|
export {default as AddressBook} from './services/AddressBook';
|
|
31
30
|
export {default as ApiAIAssistant} from './services/ApiAiAssistant';
|
|
31
|
+
export {default as UserPreference} from './services/UserPreference';
|
|
32
32
|
|
|
33
33
|
/** EntryPoint API types */
|
|
34
34
|
export type {
|
|
@@ -125,6 +125,8 @@ export type {
|
|
|
125
125
|
/** Task related types */
|
|
126
126
|
export type {
|
|
127
127
|
AgentContact,
|
|
128
|
+
/** Event emitter contract for task consumers (no @types/node needed) */
|
|
129
|
+
IEventEmitter,
|
|
128
130
|
/** Task interface */
|
|
129
131
|
ITask,
|
|
130
132
|
Interaction,
|
|
@@ -139,8 +141,16 @@ export type {
|
|
|
139
141
|
TransferPayLoad,
|
|
140
142
|
ResumeRecordingPayload,
|
|
141
143
|
WrapupPayLoad,
|
|
144
|
+
/** UI control types for task buttons */
|
|
145
|
+
InteractionUIControls,
|
|
146
|
+
TaskUILeg,
|
|
147
|
+
TaskUIControls,
|
|
148
|
+
TaskUIControlState,
|
|
142
149
|
} from './services/task/types';
|
|
143
150
|
|
|
151
|
+
/** UI controls utilities */
|
|
152
|
+
export {getDefaultUIControls} from './services/task/state-machine/uiControlsComputer';
|
|
153
|
+
|
|
144
154
|
/** Agent related types */
|
|
145
155
|
export type {
|
|
146
156
|
/** State change interface */
|
|
@@ -213,6 +223,14 @@ export type {
|
|
|
213
223
|
DialPlan,
|
|
214
224
|
/** Auxiliary code type (IDLE_CODE or WRAP_UP_CODE) */
|
|
215
225
|
AuxCodeType,
|
|
226
|
+
/** User preference data structure */
|
|
227
|
+
UserPreference as UserPreferenceData,
|
|
228
|
+
/** Request payload for creating user preferences */
|
|
229
|
+
CreateUserPreferenceRequest,
|
|
230
|
+
/** Request payload for updating user preferences */
|
|
231
|
+
UpdateUserPreferenceRequest,
|
|
232
|
+
/** Query parameters for fetching user preferences */
|
|
233
|
+
GetUserPreferenceParams,
|
|
216
234
|
} from './services/config/types';
|
|
217
235
|
|
|
218
236
|
// Constants
|