@webex/contact-center 3.12.0-next.9 → 3.12.0-next.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/.sdd/manifest.json +876 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +46 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +341 -0
  17. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  18. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  19. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  20. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  21. package/ai-docs/patterns/testing-patterns.md +480 -0
  22. package/ai-docs/patterns/typescript-patterns.md +365 -0
  23. package/ai-docs/templates/README.md +102 -0
  24. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  25. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  26. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  27. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  28. package/ai-docs/templates/new-method/00-master.md +80 -0
  29. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  30. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  31. package/ai-docs/templates/new-method/03-tests.md +201 -0
  32. package/ai-docs/templates/new-method/04-validation.md +141 -0
  33. package/ai-docs/templates/new-service/00-master.md +109 -0
  34. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  35. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  36. package/ai-docs/templates/new-service/03-integration.md +178 -0
  37. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  38. package/ai-docs/templates/new-service/05-validation.md +145 -0
  39. package/dist/cc.js +265 -29
  40. package/dist/cc.js.map +1 -1
  41. package/dist/config.js +6 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.js +17 -1
  44. package/dist/constants.js.map +1 -1
  45. package/dist/index.js +20 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/metrics/behavioral-events.js +101 -0
  48. package/dist/metrics/behavioral-events.js.map +1 -1
  49. package/dist/metrics/constants.js +25 -4
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/services/ApiAiAssistant.js +153 -8
  52. package/dist/services/ApiAiAssistant.js.map +1 -1
  53. package/dist/services/UserPreference.js +427 -0
  54. package/dist/services/UserPreference.js.map +1 -0
  55. package/dist/services/config/Util.js +3 -3
  56. package/dist/services/config/Util.js.map +1 -1
  57. package/dist/services/config/constants.js +23 -2
  58. package/dist/services/config/constants.js.map +1 -1
  59. package/dist/services/config/types.js +49 -9
  60. package/dist/services/config/types.js.map +1 -1
  61. package/dist/services/core/Err.js.map +1 -1
  62. package/dist/services/core/Utils.js +107 -32
  63. package/dist/services/core/Utils.js.map +1 -1
  64. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  65. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  66. package/dist/services/core/websocket/types.js.map +1 -1
  67. package/dist/services/index.js +1 -1
  68. package/dist/services/index.js.map +1 -1
  69. package/dist/services/task/Task.js +688 -0
  70. package/dist/services/task/Task.js.map +1 -0
  71. package/dist/services/task/TaskFactory.js +45 -0
  72. package/dist/services/task/TaskFactory.js.map +1 -0
  73. package/dist/services/task/TaskManager.js +728 -527
  74. package/dist/services/task/TaskManager.js.map +1 -1
  75. package/dist/services/task/TaskUtils.js +162 -26
  76. package/dist/services/task/TaskUtils.js.map +1 -1
  77. package/dist/services/task/constants.js +9 -2
  78. package/dist/services/task/constants.js.map +1 -1
  79. package/dist/services/task/dialer.js +78 -0
  80. package/dist/services/task/dialer.js.map +1 -1
  81. package/dist/services/task/digital/Digital.js +77 -0
  82. package/dist/services/task/digital/Digital.js.map +1 -0
  83. package/dist/services/task/state-machine/TaskStateMachine.js +837 -0
  84. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  85. package/dist/services/task/state-machine/actions.js +543 -0
  86. package/dist/services/task/state-machine/actions.js.map +1 -0
  87. package/dist/services/task/state-machine/constants.js +161 -0
  88. package/dist/services/task/state-machine/constants.js.map +1 -0
  89. package/dist/services/task/state-machine/guards.js +340 -0
  90. package/dist/services/task/state-machine/guards.js.map +1 -0
  91. package/dist/services/task/state-machine/index.js +53 -0
  92. package/dist/services/task/state-machine/index.js.map +1 -0
  93. package/dist/services/task/state-machine/types.js +54 -0
  94. package/dist/services/task/state-machine/types.js.map +1 -0
  95. package/dist/services/task/state-machine/uiControlsComputer.js +553 -0
  96. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  97. package/dist/services/task/taskDataNormalizer.js +99 -0
  98. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  99. package/dist/services/task/types.js +212 -4
  100. package/dist/services/task/types.js.map +1 -1
  101. package/dist/services/task/voice/Voice.js +1042 -0
  102. package/dist/services/task/voice/Voice.js.map +1 -0
  103. package/dist/services/task/voice/WebRTC.js +149 -0
  104. package/dist/services/task/voice/WebRTC.js.map +1 -0
  105. package/dist/types/cc.d.ts +94 -1
  106. package/dist/types/config.d.ts +6 -0
  107. package/dist/types/constants.d.ts +17 -1
  108. package/dist/types/index.d.ts +21 -6
  109. package/dist/types/metrics/constants.d.ts +21 -1
  110. package/dist/types/services/ApiAiAssistant.d.ts +22 -4
  111. package/dist/types/services/UserPreference.d.ts +118 -0
  112. package/dist/types/services/config/constants.d.ts +21 -0
  113. package/dist/types/services/config/types.d.ts +171 -10
  114. package/dist/types/services/core/Err.d.ts +4 -0
  115. package/dist/types/services/core/Utils.d.ts +33 -13
  116. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  117. package/dist/types/services/core/websocket/types.d.ts +1 -1
  118. package/dist/types/services/index.d.ts +1 -1
  119. package/dist/types/services/task/Task.d.ts +157 -0
  120. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  121. package/dist/types/services/task/TaskUtils.d.ts +46 -2
  122. package/dist/types/services/task/constants.d.ts +7 -0
  123. package/dist/types/services/task/dialer.d.ts +30 -0
  124. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  125. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1144 -0
  126. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  127. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  128. package/dist/types/services/task/state-machine/guards.d.ts +90 -0
  129. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  130. package/dist/types/services/task/state-machine/types.d.ts +267 -0
  131. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  132. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  133. package/dist/types/services/task/types.d.ts +603 -66
  134. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  135. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  136. package/dist/types/types.d.ts +135 -0
  137. package/dist/types/webex.d.ts +1 -0
  138. package/dist/types.js +118 -2
  139. package/dist/types.js.map +1 -1
  140. package/dist/webex.js +14 -2
  141. package/dist/webex.js.map +1 -1
  142. package/package.json +15 -12
  143. package/src/cc.ts +329 -30
  144. package/src/config.ts +6 -0
  145. package/src/constants.ts +17 -1
  146. package/src/index.ts +23 -5
  147. package/src/metrics/ai-docs/AGENTS.md +350 -0
  148. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  149. package/src/metrics/ai-docs/metrics-spec.md +854 -0
  150. package/src/metrics/behavioral-events.ts +106 -0
  151. package/src/metrics/constants.ts +27 -4
  152. package/src/services/ApiAiAssistant.ts +203 -8
  153. package/src/services/UserPreference.ts +509 -0
  154. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  155. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  156. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  157. package/src/services/ai-docs/AGENTS.md +386 -0
  158. package/src/services/ai-docs/services-spec.md +492 -0
  159. package/src/services/config/Util.ts +3 -3
  160. package/src/services/config/ai-docs/AGENTS.md +255 -0
  161. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  162. package/src/services/config/ai-docs/config-spec.md +669 -0
  163. package/src/services/config/constants.ts +25 -1
  164. package/src/services/config/types.ts +174 -11
  165. package/src/services/core/Err.ts +2 -0
  166. package/src/services/core/Utils.ts +123 -37
  167. package/src/services/core/ai-docs/AGENTS.md +381 -0
  168. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  169. package/src/services/core/ai-docs/core-spec.md +783 -0
  170. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  171. package/src/services/core/websocket/types.ts +1 -1
  172. package/src/services/index.ts +1 -1
  173. package/src/services/task/Task.ts +837 -0
  174. package/src/services/task/TaskFactory.ts +55 -0
  175. package/src/services/task/TaskManager.ts +739 -614
  176. package/src/services/task/TaskUtils.ts +205 -25
  177. package/src/services/task/ai-docs/AGENTS.md +457 -0
  178. package/src/services/task/ai-docs/ARCHITECTURE.md +594 -0
  179. package/src/services/task/ai-docs/task-spec.md +1319 -0
  180. package/src/services/task/constants.ts +7 -0
  181. package/src/services/task/dialer.ts +80 -0
  182. package/src/services/task/digital/Digital.ts +95 -0
  183. package/src/services/task/state-machine/TaskStateMachine.ts +1077 -0
  184. package/src/services/task/state-machine/actions.ts +685 -0
  185. package/src/services/task/state-machine/ai-docs/AGENTS.md +458 -0
  186. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1137 -0
  187. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2115 -0
  188. package/src/services/task/state-machine/constants.ts +172 -0
  189. package/src/services/task/state-machine/guards.ts +406 -0
  190. package/src/services/task/state-machine/index.ts +28 -0
  191. package/src/services/task/state-machine/types.ts +241 -0
  192. package/src/services/task/state-machine/uiControlsComputer.ts +867 -0
  193. package/src/services/task/taskDataNormalizer.ts +137 -0
  194. package/src/services/task/types.ts +710 -71
  195. package/src/services/task/voice/Voice.ts +1267 -0
  196. package/src/services/task/voice/WebRTC.ts +187 -0
  197. package/src/types.ts +166 -2
  198. package/src/utils/AGENTS.md +278 -0
  199. package/src/utils/ai-docs/utils-spec.md +381 -0
  200. package/src/webex.js +2 -0
  201. package/test/unit/spec/cc.ts +343 -23
  202. package/test/unit/spec/logger-proxy.ts +70 -0
  203. package/test/unit/spec/services/ApiAiAssistant.ts +178 -20
  204. package/test/unit/spec/services/UserPreference.ts +401 -0
  205. package/test/unit/spec/services/WebCallingService.ts +7 -1
  206. package/test/unit/spec/services/config/index.ts +30 -30
  207. package/test/unit/spec/services/core/Utils.ts +425 -8
  208. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  209. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  210. package/test/unit/spec/services/task/Task.ts +477 -0
  211. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  212. package/test/unit/spec/services/task/TaskManager.ts +834 -1704
  213. package/test/unit/spec/services/task/TaskUtils.ts +206 -0
  214. package/test/unit/spec/services/task/dialer.ts +190 -0
  215. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  216. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1825 -0
  217. package/test/unit/spec/services/task/state-machine/guards.ts +479 -0
  218. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  219. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2020 -0
  220. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  221. package/test/unit/spec/services/task/voice/Voice.ts +631 -0
  222. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  223. package/umd/contact-center.min.js +2 -2
  224. package/umd/contact-center.min.js.map +1 -1
  225. package/dist/services/task/index.js +0 -1525
  226. package/dist/services/task/index.js.map +0 -1
  227. package/dist/types/services/task/index.d.ts +0 -650
  228. package/src/services/task/index.ts +0 -1801
  229. 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
- private queue: Queue;
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 = (payload: string) => {
435
- this.taskManager.handleRealtimeWebsocketEvent(payload);
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.info('Starting CC SDK registration', {
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.info('Connecting to websocket', {
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
- if (this.agentConfig.aiFeature?.realtimeTranscripts?.enable) {
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
- await this.services.rtdWebSocketManager
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 during RTD websocket setup: ${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
- LoggerProxy.info('Starting agent station login', {
849
- module: CC_FILE,
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
- data.loginOption === LoginOption.AGENT_DN &&
861
- !isValidDialNumber(data.dialNumber, dialPlanEntries)
862
- ) {
863
- const error = new Error('INVALID_DIAL_NUMBER');
864
- // @ts-ignore - adding custom key to the error object
865
- error.details = {data: {reason: 'INVALID_DIAL_NUMBER'}} as Failure;
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
- throw error;
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 (this.agentConfig.webRtcEnabled && data.loginOption === LoginOption.BROWSER) {
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.info('event=handleConnectionLost | Connection lost', {
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.info(
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.info('Starting silent relogin process', {
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.info(
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,31 @@ 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_REAL_TIME_ASSISTANCE: 'getRealTimeAssistance',
70
+ SEND_REAL_TIME_ASSISTANCE_USER_ACTION: 'sendRealTimeAssistanceUserAction',
55
71
  FETCH_HISTORIC_TRANSCRIPTS: 'fetchHistoricTranscripts',
56
72
  };
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
- * Task class represents a contact center task that can be managed by an agent
17
+ * Agent routing service for Contact Center operations
19
18
  * @category Services
20
19
  */
21
- export {default as Task} from './services/task';
20
+ export {default as routingAgent} from './services/agent';
22
21
 
23
22
  /**
24
- * Agent routing service for Contact Center operations
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 routingAgent} from './services/agent';
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