@webex/contact-center 3.12.0-next.149 → 3.12.0-next.150

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 (37) hide show
  1. package/.sdd/manifest.json +1 -1
  2. package/ai-docs/CONTRACTS.md +1 -0
  3. package/dist/cc.js +4 -4
  4. package/dist/cc.js.map +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/services/config/Util.js +38 -45
  7. package/dist/services/config/Util.js.map +1 -1
  8. package/dist/services/config/constants.js +15 -71
  9. package/dist/services/config/constants.js.map +1 -1
  10. package/dist/services/config/index.js +49 -226
  11. package/dist/services/config/index.js.map +1 -1
  12. package/dist/services/config/types.js +33 -11
  13. package/dist/services/config/types.js.map +1 -1
  14. package/dist/types/cc.d.ts +3 -3
  15. package/dist/types/index.d.ts +16 -8
  16. package/dist/types/services/config/Util.d.ts +4 -8
  17. package/dist/types/services/config/constants.d.ts +15 -71
  18. package/dist/types/services/config/index.d.ts +16 -64
  19. package/dist/types/services/config/types.d.ts +97 -160
  20. package/dist/webex.js +1 -1
  21. package/package.json +1 -1
  22. package/src/cc.ts +4 -4
  23. package/src/index.ts +16 -8
  24. package/src/services/agent/ai-docs/AGENTS.md +1 -1
  25. package/src/services/config/Util.ts +43 -82
  26. package/src/services/config/ai-docs/AGENTS.md +34 -39
  27. package/src/services/config/ai-docs/ARCHITECTURE.md +88 -101
  28. package/src/services/config/ai-docs/config-spec.md +115 -132
  29. package/src/services/config/constants.ts +18 -80
  30. package/src/services/config/index.ts +52 -278
  31. package/src/services/config/types.ts +101 -185
  32. package/test/unit/spec/index.ts +6 -2
  33. package/test/unit/spec/services/config/Util.ts +442 -70
  34. package/test/unit/spec/services/config/index.ts +246 -544
  35. package/typedoc.md +1 -1
  36. package/umd/contact-center.min.js +2 -2
  37. package/umd/contact-center.min.js.map +1 -1
@@ -1,57 +1,42 @@
1
1
  import {LOST_CONNECTION_RECOVERY_TIMEOUT} from '../core/constants';
2
2
  import {WELLNESS_BREAK_REMINDERS_ENABLED} from './constants';
3
3
  import {
4
+ AgentProfile,
4
5
  AgentResponse,
5
6
  AuxCode,
6
7
  AuxCodeType,
7
- DesktopProfileResponse,
8
8
  DialPlanEntity,
9
9
  Entity,
10
10
  IDLE_CODE,
11
- OrgInfo,
12
- OrgSettings,
11
+ OrgDesktopLoginResponse,
13
12
  Profile,
14
- Team,
15
- TenantData,
16
- URLMapping,
13
+ TeamList,
14
+ MicrosoftConfig,
15
+ WebexConfig,
17
16
  WRAP_UP_CODE,
18
- AIFeatureFlagsResponse,
19
- AIFeatureFlags,
20
17
  } from './types';
21
18
 
22
19
  /**
23
- * Get the URL mapping for the given name
24
- * @param {Array<URLMapping>} urlMappings
25
- * @param {string} name
26
- * @returns {string}
27
- */
28
- const getUrlMapping = (urlMappings: Array<URLMapping>, name: string) => {
29
- const mappedUrl = urlMappings.find((mapping) => mapping.name === name)?.url;
30
-
31
- return mappedUrl || '';
32
- };
33
-
34
- /**
35
- * Get the MSFT and Webex configuration
36
- * @param {DesktopProfileResponse} agentProfileData
20
+ * Get the MSFT configuration
21
+ * @param {MicrosoftConfig} microsoftConfig
37
22
  * @returns {Object}
38
23
  */
39
- const getMsftConfig = (agentProfileData: DesktopProfileResponse) => {
24
+ const getMsftConfig = (microsoftConfig?: MicrosoftConfig) => {
40
25
  return {
41
- showUserDetailsMS: agentProfileData.showUserDetailsMS ?? false,
42
- stateSynchronizationMS: agentProfileData.stateSynchronizationMS ?? false,
26
+ showUserDetailsMS: microsoftConfig?.showUserDetails ?? false,
27
+ stateSynchronizationMS: microsoftConfig?.stateSynchronization ?? false,
43
28
  };
44
29
  };
45
30
 
46
31
  /**
47
32
  * Get the Webex configuration
48
- * @param {DesktopProfileResponse} agentProfileData
33
+ * @param {WebexConfig} webexConfig
49
34
  * @returns {Object}
50
35
  */
51
- const getWebexConfig = (agentProfileData: DesktopProfileResponse) => {
36
+ const getWebexConfig = (webexConfig?: WebexConfig) => {
52
37
  return {
53
- showUserDetailsWebex: agentProfileData.showUserDetailsWebex ?? false,
54
- stateSynchronizationWebex: agentProfileData.stateSynchronizationWebex ?? false,
38
+ showUserDetailsWebex: webexConfig?.showUserDetails ?? false,
39
+ stateSynchronizationWebex: webexConfig?.stateSynchronization ?? false,
55
40
  };
56
41
  };
57
42
 
@@ -65,15 +50,16 @@ const getDefaultAgentDN = (agentDNValidation: string) => {
65
50
  };
66
51
 
67
52
  /**
68
- * Get the filtered dialplan entries
53
+ * Get the dialplan entries for every active plan in the organization.
54
+ * The desktop-login aggregate does not carry the per-profile `dialPlans` selection, so all active
55
+ * plans apply.
69
56
  * @param {Array<DialPlanEntity>} dialPlanData
70
- * @param {Array<string>} profileDialPlans
71
57
  * @returns {Array<Entity>}
72
58
  */
73
- const getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[], profileDialPlans: string[]) => {
59
+ const getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[]) => {
74
60
  const dialPlanEntries = [];
75
61
  dialPlanData.forEach((dailPlan: DialPlanEntity) => {
76
- if (profileDialPlans.includes(dailPlan.id)) {
62
+ if (dailPlan.active) {
77
63
  const filteredPlan = {
78
64
  regex: dailPlan.regularExpression,
79
65
  prefix: dailPlan.prefix,
@@ -88,24 +74,17 @@ const getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[], profileDialP
88
74
  };
89
75
 
90
76
  /**
91
- * Get the filtered aux codes
77
+ * Get the active aux codes of the given type.
78
+ * The desktop-login aggregate does not carry the per-agent restriction lists, so the whole pool
79
+ * returned by the aux-code API applies.
92
80
  * @param {Array<AuxCode>} auxCodes
93
81
  * @param {AuxCodeType} type
94
- * @param {Array<string>} specificCodes
95
82
  * @returns {Array<Entity>}
96
83
  */
97
- const getFilterAuxCodes = (
98
- auxCodes: Array<AuxCode>,
99
- type: AuxCodeType,
100
- specificCodes: string[]
101
- ) => {
84
+ const getFilterAuxCodes = (auxCodes: Array<AuxCode>, type: AuxCodeType) => {
102
85
  const filteredAuxCodes: Array<Entity> = [];
103
86
  auxCodes.forEach((auxCode: AuxCode) => {
104
- if (
105
- auxCode.workTypeCode === type &&
106
- auxCode.active &&
107
- (specificCodes.length === 0 || specificCodes.includes(auxCode.id))
108
- ) {
87
+ if (auxCode.workTypeCode === type && auxCode.active) {
109
88
  filteredAuxCodes.push({
110
89
  id: auxCode.id,
111
90
  name: auxCode.name,
@@ -133,30 +112,24 @@ function getDefaultWrapUpCode(wrapUpReasonList: Entity[]) {
133
112
  * @returns {Profile}
134
113
  */
135
114
  function parseAgentConfigs(profileData: {
115
+ orgConfig: OrgDesktopLoginResponse;
136
116
  userData: AgentResponse;
137
- teamData: Team[];
138
- tenantData: TenantData;
139
- orgInfoData: OrgInfo;
117
+ agentProfileData: AgentProfile;
118
+ teamData: TeamList[];
140
119
  auxCodes: AuxCode[];
141
- orgSettingsData: OrgSettings;
142
- agentProfileData: DesktopProfileResponse;
143
120
  dialPlanData: DialPlanEntity[];
144
- urlMapping: URLMapping[];
145
121
  multimediaProfileId: string;
146
- aiFeatureFlags: AIFeatureFlagsResponse;
147
122
  }): Profile {
123
+ const {orgConfig, userData, agentProfileData, teamData, auxCodes, dialPlanData} = profileData;
148
124
  const {
149
- userData,
150
- teamData,
151
- tenantData,
152
- orgInfoData,
153
- auxCodes,
154
- orgSettingsData,
155
- agentProfileData,
156
- dialPlanData,
157
- urlMapping,
158
- aiFeatureFlags,
159
- } = profileData;
125
+ organization: orgInfoData,
126
+ organizationSetting: orgSettingsData,
127
+ tenantConfiguration: tenantData,
128
+ urlMappings,
129
+ aiFeature,
130
+ microsoftConfig,
131
+ webexConfig,
132
+ } = orgConfig;
160
133
 
161
134
  const tenantDataTimeout = tenantData.timeoutDesktopInactivityEnabled
162
135
  ? tenantData.timeoutDesktopInactivityMins
@@ -165,17 +138,9 @@ function parseAgentConfigs(profileData: {
165
138
  ? agentProfileData.timeoutDesktopInactivityMins
166
139
  : tenantDataTimeout;
167
140
 
168
- const wrapupCodes = getFilterAuxCodes(
169
- auxCodes,
170
- WRAP_UP_CODE,
171
- agentProfileData.accessWrapUpCode === 'ALL' ? [] : agentProfileData.wrapUpCodes
172
- );
141
+ const wrapupCodes = getFilterAuxCodes(auxCodes, WRAP_UP_CODE);
173
142
 
174
- const idleCodes = getFilterAuxCodes(
175
- auxCodes,
176
- IDLE_CODE,
177
- agentProfileData.accessIdleCode === 'ALL' ? [] : agentProfileData.idleCodes
178
- );
143
+ const idleCodes = getFilterAuxCodes(auxCodes, IDLE_CODE);
179
144
 
180
145
  idleCodes.push({
181
146
  id: '0',
@@ -185,8 +150,6 @@ function parseAgentConfigs(profileData: {
185
150
  }); // pushing available state to idle codes
186
151
 
187
152
  const defaultWrapUpData = getDefaultWrapUpCode(wrapupCodes);
188
- const aiFeature: AIFeatureFlags | undefined =
189
- aiFeatureFlags?.data?.length > 0 ? aiFeatureFlags.data[0] : undefined;
190
153
  const isWellnessConfigured =
191
154
  aiFeature?.agentWellbeing?.enable === true &&
192
155
  aiFeature.agentWellbeing.wellnessBreakReminders === WELLNESS_BREAK_REMINDERS_ENABLED;
@@ -203,11 +166,10 @@ function parseAgentConfigs(profileData: {
203
166
  agentName: `${userData.firstName} ${userData.lastName}`,
204
167
  agentMailId: userData.email,
205
168
  agentProfileID: userData.agentProfileId,
206
- autoAnswer: agentProfileData.autoAnswer,
207
169
  dialPlan: agentProfileData.dialPlanEnabled
208
170
  ? {
209
171
  type: 'adhocDial',
210
- dialPlanEntity: getFilteredDialplanEntries(dialPlanData, agentProfileData.dialPlans),
172
+ dialPlanEntity: getFilteredDialplanEntries(dialPlanData),
211
173
  }
212
174
  : undefined,
213
175
  multimediaProfileId: profileData.multimediaProfileId,
@@ -215,7 +177,6 @@ function parseAgentConfigs(profileData: {
215
177
  siteId: userData.siteId,
216
178
  enterpriseId: orgInfoData.tenantId,
217
179
  tenantTimezone: orgInfoData.timezone,
218
- environment: orgInfoData.environment,
219
180
  privacyShieldVisible: tenantData.privacyShieldVisible,
220
181
  organizationIdleCodes: [], // TODO: for supervisor, getOrgFilteredIdleCodes(auxCodes, false),
221
182
  idleCodesAccess: agentProfileData.accessIdleCode as 'ALL' | 'SPECIFIC',
@@ -254,8 +215,8 @@ function parseAgentConfigs(profileData: {
254
215
  analyserUserId: userData.id,
255
216
 
256
217
  urlMappings: {
257
- acqueonApiUrl: getUrlMapping(urlMapping, 'ACQUEON_API_URL'),
258
- acqueonConsoleUrl: getUrlMapping(urlMapping, 'ACQUEON_CONSOLE_URL'),
218
+ acqueonApiUrl: urlMappings?.ACQUEON_API_URL ?? '',
219
+ acqueonConsoleUrl: urlMappings?.ACQUEON_CONSOLE_URL ?? '',
259
220
  },
260
221
  isTimeoutDesktopInactivityEnabled: tenantData.timeoutDesktopInactivityEnabled,
261
222
  timeoutDesktopInactivityMins: inactivityTimeoutTimer,
@@ -264,8 +225,8 @@ function parseAgentConfigs(profileData: {
264
225
  maskSensitiveData: orgSettingsData.maskSensitiveData
265
226
  ? orgSettingsData.maskSensitiveData
266
227
  : false,
267
- microsoftConfig: getMsftConfig(agentProfileData),
268
- webexConfig: getWebexConfig(agentProfileData),
228
+ microsoftConfig: getMsftConfig(microsoftConfig),
229
+ webexConfig: getWebexConfig(webexConfig),
269
230
  lostConnectionRecoveryTimeout:
270
231
  tenantData.lostConnectionRecoveryTimeout || LOST_CONNECTION_RECOVERY_TIMEOUT,
271
232
  aiFeature,
@@ -11,11 +11,11 @@
11
11
  ## Overview
12
12
 
13
13
  The Config Service is an **internal service** that builds the comprehensive AgentProfile (`Profile` type) by:
14
- 1. Fetching user data
15
- 2. Fetching desktop profile
14
+ 1. Fetching the user desktop-login aggregate (agent identity plus `agentProfile`)
15
+ 2. Fetching the organization desktop-login aggregate (org info, org settings, tenant configuration, URL mappings, AI feature, Microsoft/Webex config)
16
16
  3. Fetching teams
17
17
  4. Fetching aux codes (idle/wrapup codes)
18
- 5. Fetching organization settings
18
+ 5. Fetching site and, when the agent profile enables it, dial-plan data
19
19
  6. Aggregating all data into a single AgentProfile
20
20
 
21
21
  The AgentProfile is the central configuration object required for an agent to operate within the contact center. It is built during the registration flow (`cc.register()`) and contains all the data an agent needs: identity, team assignments, dial plans, aux codes, login options, and feature flags. Once constructed, the AgentProfile is stored on the `ContactCenter` plugin instance as `this.agentConfig` and is used by other services (Agent, Task) throughout the session.
@@ -62,13 +62,13 @@ LoggerProxy.info(`Teams: ${this.agentConfig.teams}`, {
62
62
 
63
63
  ## Key Capabilities
64
64
 
65
- - **AgentProfile Aggregation**: Combines data from 8+ API endpoints
65
+ - **AgentProfile Aggregation**: Combines data from 6 API endpoints (5 when the agent profile disables dial plans)
66
66
  - **Aux Codes Fetching**: Gets all idle and wrapup codes with pagination
67
67
  - **Team Data**: Retrieves agent's team assignments
68
68
  - **Dial Plan**: Fetches number transformation rules
69
69
  - **Outdial ANI**: Retrieves outbound caller ID options (standalone, publicly exposed via `cc.ts`)
70
70
  - **Multimedia Profile**: Fetches channel capacity and blending config (standalone, not yet publicly exposed)
71
- - **Paginated Data Access**: `getListOfTeams` and `getListOfAuxCodes` support custom pagination independent of profile building
71
+ - **Paginated Data Access**: `getListOfTeams` and `getListOfAuxCodes` support custom pagination independent of profile building. `getListOfTeams` takes a `userDbId` — the `user.dbId` carried by the user desktop-login aggregate, not the CI user id — rather than a list of team ids
72
72
 
73
73
  ---
74
74
 
@@ -95,28 +95,20 @@ The AgentProfile is defined as the [`Profile`](../types.ts) type. This is not an
95
95
 
96
96
  ## Data Aggregation Flow
97
97
 
98
- The following diagram shows how `getAgentConfig` orchestrates multiple API calls and combines their results into the AgentProfile via `parseAgentConfigs()`:
98
+ The following diagram shows how `getAgentConfig` orchestrates six API calls and combines their results into the AgentProfile via `parseAgentConfigs()`:
99
99
 
100
100
  ```
101
- getUserUsingCI ────────────┐
102
- │
103
- getOrgInfo ────────────────┤
104
- │
105
- getOrganizationSetting ────┤
106
- │
107
- getTenantData ─────────────┤
108
- │
109
- getURLMapping ─────────────┼──► parseAgentConfigs() ──► AgentProfile
110
- │
111
- getAllAuxCodes ─────────────┤
112
- │
113
- getDesktopProfileById ─────┤
114
- │
115
- getSiteInfo ───────────────┤ (computes multimediaProfileId)
116
- │
117
- getAllTeams ────────────────┤
118
- │
119
- getDialPlanData ───────────┘
101
+ getUserDesktopLoginConfig ──┐ (awaited first; supplies dbId, siteId, dialPlanEnabled)
102
+ │
103
+ getOrgDesktopLoginConfig ───┤ (org info, org settings, tenant config, urlMappings,
104
+ │ aiFeature, microsoftConfig, webexConfig)
105
+ getAllAuxCodes ─────────────┼──► parseAgentConfigs() ──► AgentProfile
106
+ │
107
+ getAllTeams ────────────────┤ (filtered by userId == user.dbId)
108
+ │
109
+ getSiteInfo ────────────────┤ (team → site fallback for multimediaProfileId)
110
+ │
111
+ getDialPlanData ────────────┘ (only when agentProfile.dialPlanEnabled)
120
112
  ```
121
113
 
122
114
  ---
@@ -130,12 +122,12 @@ Main method that aggregates all configuration data into the AgentProfile.
130
122
  **Returns**: `Promise<Profile>`
131
123
 
132
124
  **Flow**:
133
- 1. Fetch user data (`getUserUsingCI`)
134
- 2. Fetch org info (`getOrgInfo`), settings (`getOrganizationSetting`), tenant data (`getTenantData`) in parallel
135
- 3. Fetch aux codes with pagination (`getAllAuxCodes`)
136
- 4. Fetch desktop profile (`getDesktopProfileById`), site info (`getSiteInfo`)
137
- 5. Fetch dial plan if enabled (`getDialPlanData`)
138
- 6. Fetch teams (`getAllTeams`)
125
+ 1. Fire the user aggregate (`getUserDesktopLoginConfig`), the org aggregate (`getOrgDesktopLoginConfig`) and aux codes (`getAllAuxCodes`) in parallel
126
+ 2. Await the user aggregate — it supplies `user.dbId`, `user.siteId` and `agentProfile.dialPlanEnabled`
127
+ 3. Fetch site info (`getSiteInfo`) and teams filtered by `userId` (`getAllTeams`)
128
+ 4. Fetch dial plan if `agentProfile.dialPlanEnabled` (`getDialPlanData`)
129
+ 5. `Promise.all` the five remaining promises
130
+ 6. Resolve `multimediaProfileId` from the team value, falling back to the site value
139
131
  7. Parse and combine all data (`parseAgentConfigs`)
140
132
 
141
133
  ---
@@ -148,7 +140,7 @@ These methods exist in `AgentConfigService` but are **not** part of the `getAgen
148
140
  |--------|--------|---------|-------------|
149
141
  | `getOutdialAniEntries(orgId, params)` | **Publicly exposed** via `cc.getOutdialAniEntries()` | `OutdialAniEntriesResponse` | Fetch outbound ANI entries for caller ID selection. Supports pagination and search via [`OutdialAniParams`](../types.ts). |
150
142
  | `getMultimediaProfileById(orgId, multimediaProfileId)` | **Not exposed, never called** | `MultimediaProfileResponse` | Fetch channel capacities (chat, email, telephony, social) and blending config. Available but unused anywhere. |
151
- | `getListOfTeams(orgId, page, pageSize, filter)` | Used internally by `getAllTeams()` | `ListTeamsResponse` | Single-page team fetch with pagination metadata. Useful for custom pagination. |
143
+ | `getListOfTeams(orgId, page, pageSize, userDbId)` | Used internally by `getAllTeams()` | `ListTeamsResponse` | Single-page team fetch with pagination metadata, filtered by `user.dbId` (the wire field is `filter=userId==` but the value is the database id, not the CI user id). The filter value must stay unquoted — the quoted form returns HTTP 400. |
152
144
  | `getListOfAuxCodes(orgId, page, pageSize, filter, attributes)` | Used internally by `getAllAuxCodes()` | `ListAuxCodesResponse` | Single-page aux code fetch with pagination metadata. Useful for custom pagination. |
153
145
 
154
146
  Additionally, the following endpoints are defined in `constants.ts` `endPointMap` but are consumed by separate service classes, not by `AgentConfigService`:
@@ -168,23 +160,26 @@ Types used by the config service, all defined in [`types.ts`](../types.ts):
168
160
  | Type | Description |
169
161
  |------|-------------|
170
162
  | `Profile` | Final aggregated agent config returned by `getAgentConfig()` |
171
- | `AgentResponse` | Raw response from `getUserUsingCI()` — agent metadata, teamIds, siteId, agentProfileId |
172
- | `DesktopProfileResponse` | Desktop profile settings — layout, dial plan, login options |
163
+ | `OrgDesktopLoginResponse` | Response from `getOrgDesktopLoginConfig()` — `organization`, `organizationSetting`, `tenantConfiguration`, `urlMappings`, `aiFeature`, `microsoftConfig`, `webexConfig` |
164
+ | `UserDesktopLoginResponse` | Response from `getUserDesktopLoginConfig()` — `user` and `agentProfile` sections |
165
+ | `AgentResponse` | `user` section of the user aggregate — agent metadata, `dbId`, `siteId`, `agentProfileId` |
166
+ | `AgentProfile` | `agentProfile` section of the user aggregate — layout, dial-plan enablement, login options |
173
167
  | `TeamList` | Team record from API — `id`, `name`, `teamType`, `siteId`, `multiMediaProfileId` |
174
168
  | `ListTeamsResponse` | Paginated wrapper around `TeamList[]` with `meta` for pagination |
175
169
  | `OrgInfo` | Organization info — `tenantId`, timezone |
176
170
  | `OrgSettings` | Org feature flags — `webRtcEnabled`, `sensitiveDataMaskingEnabled` |
177
171
  | `TenantData` | Tenant-level config — inactivity timeout, `forceDefaultDn`, `outdialEnabled` |
178
172
  | `SiteInfo` | Site config — `id`, `name`, `multimediaProfileId` |
179
- | `URLMapping` | External URL mapping — `id`, `name`, `url` |
173
+ | `OrgUrlMappings` | Keyed external URL mappings — `ACQUEON_API_URL`, `ACQUEON_CONSOLE_URL` |
174
+ | `MicrosoftConfig` | Org-level Microsoft presence config — `showUserDetails`, `stateSynchronization` |
175
+ | `WebexConfig` | Org-level Webex presence config — `showUserDetails`, `stateSynchronization` |
180
176
  | `MultimediaProfileResponse` | Multimedia profile — channel capacities and settings |
181
177
  | `AuxCode` | Auxiliary code record — `id`, `name`, `description`, `workTypeCode` |
182
178
  | `ListAuxCodesResponse` | Paginated wrapper around `AuxCode[]` with `meta` |
183
- | `DialPlanEntity` | Dial plan rule — regex pattern, prefix, strip digits |
179
+ | `DialPlanEntity` | Dial plan rule — regex pattern, prefix, strip digits, `active` |
184
180
  | `Entity` | Basic entity info — `isSystem`, `name`, `id`, `description` |
185
181
  | `WrapupData` | Wrap-up config — auto-wrapup settings, available wrapup codes |
186
182
  | `OutdialAniParams` | Parameters for `getOutdialAniEntries()` — ANI ID, pagination, filtering |
187
- | `Team` | Simplified team shape in `Profile` — `teamId`, `teamName`, `desktopLayoutId` |
188
183
 
189
184
  ## Events (CC_EVENTS)
190
185
 
@@ -212,14 +207,14 @@ Key types in `services/config/types.ts`:
212
207
  | `CC_TASK_EVENTS` | Task-specific events |
213
208
  | `AuxCode` | Idle/wrapup code definition |
214
209
  | `Team` | Team configuration |
215
- | `DesktopProfileResponse` | Desktop profile settings |
210
+ | `AgentProfile` | Agent profile settings from the user aggregate |
216
211
  | `LoginOption` | Login types (BROWSER, EXTENSION, AGENT_DN) |
217
212
 
218
213
  ---
219
214
 
220
215
  ## Error Handling
221
216
 
222
- All API methods within the config service throw errors on failure. Since `getAgentConfig` calls multiple sub-APIs (`getUserUsingCI`, `getOrgInfo`, `getOrganizationSetting`, `getTenantData`, `getAllAuxCodes`, `getDesktopProfileById`, `getAllTeams`, `getDialPlanData`, etc.) and awaits them via `Promise.all`, **a failure in any single sub-API will cause the entire AgentProfile fetch to fail**. There is no partial profile — either all data is successfully fetched and aggregated, or the operation throws.
217
+ All API methods within the config service throw errors on failure. Since `getAgentConfig` calls multiple sub-APIs (`getUserDesktopLoginConfig`, `getOrgDesktopLoginConfig`, `getAllAuxCodes`, `getAllTeams`, `getSiteInfo`, `getDialPlanData`) and awaits them via `Promise.all`, **a failure in any single sub-API will cause the entire AgentProfile fetch to fail**. There is no partial profile — either all data is successfully fetched and aggregated, or the operation throws.
223
218
 
224
219
  ```typescript
225
220
  try {