@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.
- package/.sdd/manifest.json +1 -1
- package/ai-docs/CONTRACTS.md +1 -0
- package/dist/cc.js +4 -4
- package/dist/cc.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/config/Util.js +38 -45
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +15 -71
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +49 -226
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +33 -11
- package/dist/services/config/types.js.map +1 -1
- package/dist/types/cc.d.ts +3 -3
- package/dist/types/index.d.ts +16 -8
- package/dist/types/services/config/Util.d.ts +4 -8
- package/dist/types/services/config/constants.d.ts +15 -71
- package/dist/types/services/config/index.d.ts +16 -64
- package/dist/types/services/config/types.d.ts +97 -160
- package/dist/webex.js +1 -1
- package/package.json +1 -1
- package/src/cc.ts +4 -4
- package/src/index.ts +16 -8
- package/src/services/agent/ai-docs/AGENTS.md +1 -1
- package/src/services/config/Util.ts +43 -82
- package/src/services/config/ai-docs/AGENTS.md +34 -39
- package/src/services/config/ai-docs/ARCHITECTURE.md +88 -101
- package/src/services/config/ai-docs/config-spec.md +115 -132
- package/src/services/config/constants.ts +18 -80
- package/src/services/config/index.ts +52 -278
- package/src/services/config/types.ts +101 -185
- package/test/unit/spec/index.ts +6 -2
- package/test/unit/spec/services/config/Util.ts +442 -70
- package/test/unit/spec/services/config/index.ts +246 -544
- package/typedoc.md +1 -1
- package/umd/contact-center.min.js +2 -2
- 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
|
-
|
|
12
|
-
OrgSettings,
|
|
11
|
+
OrgDesktopLoginResponse,
|
|
13
12
|
Profile,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
24
|
-
* @param {
|
|
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 = (
|
|
24
|
+
const getMsftConfig = (microsoftConfig?: MicrosoftConfig) => {
|
|
40
25
|
return {
|
|
41
|
-
showUserDetailsMS:
|
|
42
|
-
stateSynchronizationMS:
|
|
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 {
|
|
33
|
+
* @param {WebexConfig} webexConfig
|
|
49
34
|
* @returns {Object}
|
|
50
35
|
*/
|
|
51
|
-
const getWebexConfig = (
|
|
36
|
+
const getWebexConfig = (webexConfig?: WebexConfig) => {
|
|
52
37
|
return {
|
|
53
|
-
showUserDetailsWebex:
|
|
54
|
-
stateSynchronizationWebex:
|
|
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
|
|
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[]
|
|
59
|
+
const getFilteredDialplanEntries = (dialPlanData: DialPlanEntity[]) => {
|
|
74
60
|
const dialPlanEntries = [];
|
|
75
61
|
dialPlanData.forEach((dailPlan: DialPlanEntity) => {
|
|
76
|
-
if (
|
|
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
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
tenantData,
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
|
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:
|
|
258
|
-
acqueonConsoleUrl:
|
|
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(
|
|
268
|
-
webexConfig: getWebexConfig(
|
|
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
|
|
15
|
-
2. Fetching desktop
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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.
|
|
134
|
-
2.
|
|
135
|
-
3. Fetch
|
|
136
|
-
4. Fetch
|
|
137
|
-
5.
|
|
138
|
-
6.
|
|
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,
|
|
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
|
-
| `
|
|
172
|
-
| `
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
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 (`
|
|
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 {
|