@egain/ai-agent-sdk 0.1.0
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/README.md +295 -0
- package/dist/browser.js +22739 -0
- package/dist/core/AiAgent.d.ts +1126 -0
- package/dist/core/AiAgent.d.ts.map +1 -0
- package/dist/core/AiAgent.js +2037 -0
- package/dist/core/AiAgent.js.map +1 -0
- package/dist/core/api/ApiHelper.d.ts +433 -0
- package/dist/core/api/ApiHelper.d.ts.map +1 -0
- package/dist/core/api/ApiHelper.js +689 -0
- package/dist/core/api/ApiHelper.js.map +1 -0
- package/dist/core/api/CacheAdapter.d.ts +295 -0
- package/dist/core/api/CacheAdapter.d.ts.map +1 -0
- package/dist/core/api/CacheAdapter.js +298 -0
- package/dist/core/api/CacheAdapter.js.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts +87 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.js +257 -0
- package/dist/core/auth/AnonymousAuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthProvider.d.ts +13 -0
- package/dist/core/auth/AuthProvider.d.ts.map +1 -0
- package/dist/core/auth/AuthProvider.js +2 -0
- package/dist/core/auth/AuthProvider.js.map +1 -0
- package/dist/core/auth/AuthStrategy.d.ts +74 -0
- package/dist/core/auth/AuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AuthStrategy.js +2 -0
- package/dist/core/auth/AuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthenticationService.d.ts +226 -0
- package/dist/core/auth/AuthenticationService.d.ts.map +1 -0
- package/dist/core/auth/AuthenticationService.js +344 -0
- package/dist/core/auth/AuthenticationService.js.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts +62 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js +78 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts +136 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.js +409 -0
- package/dist/core/auth/PKCEAuthStrategy.js.map +1 -0
- package/dist/core/auth/PreAuthStrategy.d.ts +101 -0
- package/dist/core/auth/PreAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PreAuthStrategy.js +216 -0
- package/dist/core/auth/PreAuthStrategy.js.map +1 -0
- package/dist/core/auth/msal-browser.js +19683 -0
- package/dist/core/auth/msal-loader.d.ts +14 -0
- package/dist/core/auth/msal-loader.d.ts.map +1 -0
- package/dist/core/auth/msal-loader.js +43 -0
- package/dist/core/auth/msal-loader.js.map +1 -0
- package/dist/core/connection/Connection.d.ts +168 -0
- package/dist/core/connection/Connection.d.ts.map +1 -0
- package/dist/core/connection/Connection.js +290 -0
- package/dist/core/connection/Connection.js.map +1 -0
- package/dist/core/connection/ConnectionState.d.ts +11 -0
- package/dist/core/connection/ConnectionState.d.ts.map +1 -0
- package/dist/core/connection/ConnectionState.js +12 -0
- package/dist/core/connection/ConnectionState.js.map +1 -0
- package/dist/core/connection/Transport.d.ts +98 -0
- package/dist/core/connection/Transport.d.ts.map +1 -0
- package/dist/core/connection/Transport.js +27 -0
- package/dist/core/connection/Transport.js.map +1 -0
- package/dist/core/connection/WebSocketTransport.d.ts +65 -0
- package/dist/core/connection/WebSocketTransport.d.ts.map +1 -0
- package/dist/core/connection/WebSocketTransport.js +177 -0
- package/dist/core/connection/WebSocketTransport.js.map +1 -0
- package/dist/core/errors/SDKError.d.ts +27 -0
- package/dist/core/errors/SDKError.d.ts.map +1 -0
- package/dist/core/errors/SDKError.js +43 -0
- package/dist/core/errors/SDKError.js.map +1 -0
- package/dist/core/events/EventEmitter.d.ts +120 -0
- package/dist/core/events/EventEmitter.d.ts.map +1 -0
- package/dist/core/events/EventEmitter.js +183 -0
- package/dist/core/events/EventEmitter.js.map +1 -0
- package/dist/core/logging/LogLevel.d.ts +33 -0
- package/dist/core/logging/LogLevel.d.ts.map +1 -0
- package/dist/core/logging/LogLevel.js +40 -0
- package/dist/core/logging/LogLevel.js.map +1 -0
- package/dist/core/logging/Logger.d.ts +120 -0
- package/dist/core/logging/Logger.d.ts.map +1 -0
- package/dist/core/logging/Logger.js +204 -0
- package/dist/core/logging/Logger.js.map +1 -0
- package/dist/core/logging/globalLogger.d.ts +8 -0
- package/dist/core/logging/globalLogger.d.ts.map +1 -0
- package/dist/core/logging/globalLogger.js +12 -0
- package/dist/core/logging/globalLogger.js.map +1 -0
- package/dist/core/logging/types.d.ts +45 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +2 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/message/BaseMessageHandler.d.ts +208 -0
- package/dist/core/message/BaseMessageHandler.d.ts.map +1 -0
- package/dist/core/message/BaseMessageHandler.js +155 -0
- package/dist/core/message/BaseMessageHandler.js.map +1 -0
- package/dist/core/message/Message.d.ts +69 -0
- package/dist/core/message/Message.d.ts.map +1 -0
- package/dist/core/message/Message.js +131 -0
- package/dist/core/message/Message.js.map +1 -0
- package/dist/core/message/MessageProcessor.d.ts +51 -0
- package/dist/core/message/MessageProcessor.d.ts.map +1 -0
- package/dist/core/message/MessageProcessor.js +123 -0
- package/dist/core/message/MessageProcessor.js.map +1 -0
- package/dist/core/message/MessageTypes.d.ts +123 -0
- package/dist/core/message/MessageTypes.d.ts.map +1 -0
- package/dist/core/message/MessageTypes.js +106 -0
- package/dist/core/message/MessageTypes.js.map +1 -0
- package/dist/core/message/Transcript.d.ts +373 -0
- package/dist/core/message/Transcript.d.ts.map +1 -0
- package/dist/core/message/Transcript.js +355 -0
- package/dist/core/message/Transcript.js.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts +26 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.js +130 -0
- package/dist/core/message/handlers/AgentMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts +12 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js +49 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts +12 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js +49 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts +12 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.js +46 -0
- package/dist/core/message/handlers/HeartbeatHandler.js.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts +30 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js +84 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js.map +1 -0
- package/dist/core/message/types.d.ts +107 -0
- package/dist/core/message/types.d.ts.map +1 -0
- package/dist/core/message/types.js +30 -0
- package/dist/core/message/types.js.map +1 -0
- package/dist/core/platform/HookContract.d.ts +112 -0
- package/dist/core/platform/HookContract.d.ts.map +1 -0
- package/dist/core/platform/HookContract.js +13 -0
- package/dist/core/platform/HookContract.js.map +1 -0
- package/dist/core/platform/PlatformComponentService.d.ts +40 -0
- package/dist/core/platform/PlatformComponentService.d.ts.map +1 -0
- package/dist/core/platform/PlatformComponentService.js +12 -0
- package/dist/core/platform/PlatformComponentService.js.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts +41 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.js +110 -0
- package/dist/core/platform/PlatformScriptLoader.js.map +1 -0
- package/dist/core/polyfills.d.ts +16 -0
- package/dist/core/polyfills.d.ts.map +1 -0
- package/dist/core/polyfills.js +168 -0
- package/dist/core/polyfills.js.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts +234 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.js +636 -0
- package/dist/core/portal-initializer/PortalInitializer.js.map +1 -0
- package/dist/core/queue/MessageQueue.d.ts +277 -0
- package/dist/core/queue/MessageQueue.d.ts.map +1 -0
- package/dist/core/queue/MessageQueue.js +291 -0
- package/dist/core/queue/MessageQueue.js.map +1 -0
- package/dist/core/types/PortalTypes.d.ts +51 -0
- package/dist/core/types/PortalTypes.d.ts.map +1 -0
- package/dist/core/types/PortalTypes.js +8 -0
- package/dist/core/types/PortalTypes.js.map +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,636 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PortalInitializer — Event-driven chained pipeline for portal-based agent initialization
|
|
3
|
+
*
|
|
4
|
+
* Uses a chained architecture where each step either auto-selects and calls
|
|
5
|
+
* the next method directly, or emits an event and returns. The pipeline
|
|
6
|
+
* progresses via direct method calls triggered by the consumer's selection
|
|
7
|
+
* methods on AiAgent (selectPortal, selectAgent, selectUserProfile).
|
|
8
|
+
*
|
|
9
|
+
* Chain: start() → fetchPortals() → handleSelectedPortal() → handleSelectedAgent() → completeInitialization()
|
|
10
|
+
*
|
|
11
|
+
* Public handler methods: onPortalSelected(), onAgentSelected(), onProfileSelected()
|
|
12
|
+
*
|
|
13
|
+
* The pipeline has zero WebSocket knowledge — it is pure REST. The consumer
|
|
14
|
+
* calls connect() after receiving the initialized event.
|
|
15
|
+
*
|
|
16
|
+
* **cc-widget customer parity** (`agentDetails.userType === 'customer'` with non-empty `agentDetails.portals`):
|
|
17
|
+
* portal list is built only from those IDs (no myportals / portalIds / intersection / PCS / Flow B list filter).
|
|
18
|
+
* When `userType === 'customer'` or `initParams.authType === 'customer'`, skips GET userprofiles and may set
|
|
19
|
+
* profiles from `portalDetails.portal[0].portalSettings.defaultUserProfile` only. PUT `.../userprofiles/.../select`
|
|
20
|
+
* runs only for `userType === 'agent'`, `authType === 'user'`, or legacy unset typing (defaults to persist).
|
|
21
|
+
*
|
|
22
|
+
* @module PortalInitializer
|
|
23
|
+
*/
|
|
24
|
+
/** Comma-separated portal IDs (cc-widget `portalIds` shortcut). */
|
|
25
|
+
function parsePortalIdsFromParams(params) {
|
|
26
|
+
const raw = params.portalIds ?? params.portalids ?? "";
|
|
27
|
+
if (!raw.trim())
|
|
28
|
+
return [];
|
|
29
|
+
return raw
|
|
30
|
+
.split(",")
|
|
31
|
+
.map((s) => s.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
}
|
|
34
|
+
/** True when two API ids match; compares via String() only (no Number() coercion). */
|
|
35
|
+
function sameId(a, b) {
|
|
36
|
+
if (a == null || b == null)
|
|
37
|
+
return false;
|
|
38
|
+
if (a === "" || b === "")
|
|
39
|
+
return false;
|
|
40
|
+
return String(a) === String(b);
|
|
41
|
+
}
|
|
42
|
+
function getPortalIdRaw(p) {
|
|
43
|
+
const v = p.id;
|
|
44
|
+
if (v === null || v === undefined || v === "")
|
|
45
|
+
return null;
|
|
46
|
+
return typeof v === "number" || typeof v === "string" ? v : String(v);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Intersection of user portals and agent-configured portals (cc-widget `filterPortals`).
|
|
50
|
+
* Empty agent list yields all user portals; otherwise strict ID intersection (can be empty).
|
|
51
|
+
*/
|
|
52
|
+
function filterPortalsUserAndAgent(userPortals, botPortals) {
|
|
53
|
+
if (!userPortals?.length)
|
|
54
|
+
return [];
|
|
55
|
+
if (!botPortals?.length)
|
|
56
|
+
return [...userPortals];
|
|
57
|
+
const botIds = [];
|
|
58
|
+
for (const item of botPortals) {
|
|
59
|
+
if (typeof item === "string" || typeof item === "number") {
|
|
60
|
+
if (item !== "")
|
|
61
|
+
botIds.push(item);
|
|
62
|
+
}
|
|
63
|
+
else if (item != null && typeof item === "object") {
|
|
64
|
+
const id = item.id;
|
|
65
|
+
if (id != null && id !== "")
|
|
66
|
+
botIds.push(typeof id === "number" || typeof id === "string" ? id : String(id));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return userPortals.filter((u) => {
|
|
70
|
+
const uid = getPortalIdRaw(u);
|
|
71
|
+
if (uid == null)
|
|
72
|
+
return false;
|
|
73
|
+
return botIds.some((b) => sameId(b, uid));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Flow B portal department filter: cc-widget uses `store.state.departmentId` from fetched agent details.
|
|
78
|
+
* Prefer `agentDetails.departmentId`; if absent, use `initParams.departmentId` / `departmentid`.
|
|
79
|
+
* Values are kept as string or number (no numeric coercion).
|
|
80
|
+
*/
|
|
81
|
+
function resolveDepartmentIdForAgentSelection(agentDetails, params) {
|
|
82
|
+
const fromDetails = agentDetails?.departmentId;
|
|
83
|
+
if (fromDetails != null && fromDetails !== "") {
|
|
84
|
+
if (typeof fromDetails === "string") {
|
|
85
|
+
const t = fromDetails.trim();
|
|
86
|
+
return t === "" ? null : t;
|
|
87
|
+
}
|
|
88
|
+
return fromDetails;
|
|
89
|
+
}
|
|
90
|
+
const raw = params.departmentId ?? params.departmentid;
|
|
91
|
+
if (raw === undefined || raw === "")
|
|
92
|
+
return null;
|
|
93
|
+
const t = raw.trim();
|
|
94
|
+
return t === "" ? null : t;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Event-driven chained pipeline for the CC widget initialization flow.
|
|
98
|
+
*
|
|
99
|
+
* Each step auto-selects (count == 1) and calls the next method directly,
|
|
100
|
+
* or emits an event and returns. The consumer's selection call triggers the
|
|
101
|
+
* next step — no await gates.
|
|
102
|
+
*
|
|
103
|
+
* Supports Flow A (specific agent: portal → profile) and Flow B (default agent: portal → agent → profile).
|
|
104
|
+
*/
|
|
105
|
+
export class PortalInitializer {
|
|
106
|
+
constructor(deps) {
|
|
107
|
+
this.portals = [];
|
|
108
|
+
this.profiles = [];
|
|
109
|
+
this.agents = [];
|
|
110
|
+
this.destroyed = false;
|
|
111
|
+
this.deps = deps;
|
|
112
|
+
}
|
|
113
|
+
readCachedFromAdapter(key) {
|
|
114
|
+
const pc = this.deps.pipelineCache;
|
|
115
|
+
if (!pc)
|
|
116
|
+
return null;
|
|
117
|
+
const entry = pc.adapter.get(key);
|
|
118
|
+
if (!entry)
|
|
119
|
+
return null;
|
|
120
|
+
if (pc.ttl != null && Date.now() - entry.timestamp > pc.ttl) {
|
|
121
|
+
pc.adapter.delete(key);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return entry.value;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Start the pipeline. Performs pre-flight (token acquisition, portal-selection
|
|
128
|
+
* requirement check) and kicks off fetchPortals() when needed.
|
|
129
|
+
*
|
|
130
|
+
* Per the architecture diagram, start() checks queryParam.isDefaultAgent:
|
|
131
|
+
* - True → fetchPortals() (Flow B)
|
|
132
|
+
* - False → fetchPortals() (Flow A); portal list may be narrowed via `agentid` + `agentDetails.portals` like cc-widget
|
|
133
|
+
*/
|
|
134
|
+
async start() {
|
|
135
|
+
const { logger, authService, isAgentSelectionMode } = this.deps;
|
|
136
|
+
logger.info("PortalInitializer pipeline started", { isAgentSelectionMode });
|
|
137
|
+
const preflight = await authService.getToken();
|
|
138
|
+
if (preflight == null || String(preflight).trim() === "") {
|
|
139
|
+
throw new Error("Authentication token required for portal initialization");
|
|
140
|
+
}
|
|
141
|
+
logger.debug("Token obtained for portal pipeline");
|
|
142
|
+
await this.fetchPortals();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Fetch portals (once), apply mode-specific filtering, then auto-select or emit.
|
|
146
|
+
*
|
|
147
|
+
* Mirrors cc-widget's `getFilteredPortals`: resolve the portal list first
|
|
148
|
+
* (customer synthetic / portalIds / API), then branch on mode for filtering.
|
|
149
|
+
* Customer synthetic path skips filtering entirely.
|
|
150
|
+
*/
|
|
151
|
+
async fetchPortals() {
|
|
152
|
+
const { apiHelper, logger, initParams, agentDetails, isAgentSelectionMode } = this.deps;
|
|
153
|
+
let portals;
|
|
154
|
+
if (agentDetails?.userType === 'customer' && (agentDetails.portals?.length ?? 0) > 0) {
|
|
155
|
+
const rawList = agentDetails.portals || [];
|
|
156
|
+
portals = rawList.map((entry) => {
|
|
157
|
+
const id = typeof entry === 'object' && entry != null
|
|
158
|
+
? entry.id
|
|
159
|
+
: entry;
|
|
160
|
+
return { id, name: ' ' };
|
|
161
|
+
});
|
|
162
|
+
logger.info('Customer portal list from agentDetails.portals (cc-widget parity)', { count: portals.length });
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const idList = parsePortalIdsFromParams(initParams);
|
|
166
|
+
if (idList.length > 0) {
|
|
167
|
+
logger.info('Using portalIds from params', { count: idList.length });
|
|
168
|
+
portals = idList.map((id) => ({ id }));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const userId = initParams.userid ?? initParams.userId ?? 'default';
|
|
172
|
+
const themeTemplate = (initParams.templateName || initParams.shortUrlTemplate || '').trim();
|
|
173
|
+
const shortUrlTemplate = themeTemplate || undefined;
|
|
174
|
+
const language = typeof agentDetails?.languageCode === 'string' && agentDetails.languageCode.trim()
|
|
175
|
+
? agentDetails.languageCode.trim()
|
|
176
|
+
: 'en-us';
|
|
177
|
+
logger.info('Fetching portals...');
|
|
178
|
+
try {
|
|
179
|
+
const fromMy = await apiHelper.getMyPortals({ language, userId, shortUrlTemplate });
|
|
180
|
+
portals = Array.isArray(fromMy) ? fromMy : [];
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
logger.error('Failed to fetch portals', err instanceof Error ? err : new Error(String(err)));
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
let filterResult;
|
|
188
|
+
if (!isAgentSelectionMode) {
|
|
189
|
+
filterResult = await this.filterAgentSpecificPortals(portals);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
filterResult = await this.filterDepartmentSpecificPortals(portals);
|
|
193
|
+
}
|
|
194
|
+
if (filterResult.pcsAutoSelected) {
|
|
195
|
+
this.selectedPortal = filterResult.pcsAutoSelected;
|
|
196
|
+
await this.callOnPortalSelected(filterResult.pcsAutoSelected);
|
|
197
|
+
await this.handleSelectedPortal();
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
portals = filterResult.portals;
|
|
201
|
+
}
|
|
202
|
+
await this.emitPortalsAvailable(portals);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Flow A filter: intersect user portals with the specific agent's portal list
|
|
206
|
+
* (when `initParams.agentid` is set), then run PCS hooks.
|
|
207
|
+
*/
|
|
208
|
+
async filterAgentSpecificPortals(portals) {
|
|
209
|
+
const { logger, initParams, agentDetails } = this.deps;
|
|
210
|
+
const agentIdForFilter = initParams.agentid || initParams.agentId || this.deps.agentId;
|
|
211
|
+
if (agentIdForFilter) {
|
|
212
|
+
const botList = Array.isArray(agentDetails?.portals) ? agentDetails.portals : [];
|
|
213
|
+
const beforeCount = portals.length;
|
|
214
|
+
portals = filterPortalsUserAndAgent(portals, botList);
|
|
215
|
+
logger.info('Filtered portals (agent intersection)', {
|
|
216
|
+
before: beforeCount,
|
|
217
|
+
after: portals.length,
|
|
218
|
+
agentid: agentIdForFilter,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return this.applyPcsHooks(portals);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Flow B filter: run PCS hooks, then narrow portals to those whose department
|
|
225
|
+
* matches the resolved `departmentId` (from agentDetails or initParams).
|
|
226
|
+
*/
|
|
227
|
+
async filterDepartmentSpecificPortals(portals) {
|
|
228
|
+
const { logger, agentDetails, initParams } = this.deps;
|
|
229
|
+
const pcsResult = await this.applyPcsHooks(portals);
|
|
230
|
+
if (pcsResult.pcsAutoSelected)
|
|
231
|
+
return pcsResult;
|
|
232
|
+
portals = pcsResult.portals;
|
|
233
|
+
const flowBDepartmentId = resolveDepartmentIdForAgentSelection(agentDetails, initParams);
|
|
234
|
+
if (flowBDepartmentId == null) {
|
|
235
|
+
throw new Error('departmentId is required for Flow B (agent selection mode): set agentDetails.departmentId from the default agent API response, or pass initParams.departmentId');
|
|
236
|
+
}
|
|
237
|
+
const beforeDept = portals.length;
|
|
238
|
+
portals = portals.filter((p) => sameId(p.department?.id, flowBDepartmentId));
|
|
239
|
+
logger.info('Filtered portals by department (Flow B)', {
|
|
240
|
+
before: beforeDept,
|
|
241
|
+
after: portals.length,
|
|
242
|
+
departmentId: flowBDepartmentId,
|
|
243
|
+
});
|
|
244
|
+
return { portals };
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Run PCS getPortalList and getDefaultPortal hooks on the portal list.
|
|
248
|
+
* Errors cause the portal list to be cleared (cc-widget callPortalWebhook parity).
|
|
249
|
+
*/
|
|
250
|
+
async applyPcsHooks(portals) {
|
|
251
|
+
const { logger } = this.deps;
|
|
252
|
+
const pcs = this.deps.platformComponentService;
|
|
253
|
+
try {
|
|
254
|
+
let portalList = portals;
|
|
255
|
+
if (pcs?.getPortalList) {
|
|
256
|
+
const processed = await pcs.getPortalList(portals);
|
|
257
|
+
portalList = Array.isArray(processed) ? processed : [];
|
|
258
|
+
logger.info("PCS.getPortalList processed portal list", {
|
|
259
|
+
count: portalList.length
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
if (pcs?.getDefaultPortal && portalList.length > 0) {
|
|
263
|
+
const defaultPortal = await pcs.getDefaultPortal(portalList);
|
|
264
|
+
if (defaultPortal && defaultPortal.id != null) {
|
|
265
|
+
logger.info("PCS.getDefaultPortal auto-selected portal", {
|
|
266
|
+
portalId: defaultPortal.id,
|
|
267
|
+
name: defaultPortal.name
|
|
268
|
+
});
|
|
269
|
+
return { portals: portalList, pcsAutoSelected: defaultPortal };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return { portals: portalList };
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
logger.warn("PCS portal hooks failed; using empty portal list (cc-widget callPortalWebhook parity)", err instanceof Error ? err : new Error(String(err)));
|
|
276
|
+
return { portals: [] };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Validate that the portal list is non-empty, store it, then either
|
|
281
|
+
* auto-select (single portal) or emit portalsAvailable for the consumer.
|
|
282
|
+
*/
|
|
283
|
+
async emitPortalsAvailable(portals) {
|
|
284
|
+
const { logger, emit, createAgentEventResponse } = this.deps;
|
|
285
|
+
if (!portals || portals.length === 0) {
|
|
286
|
+
throw new Error("No portals available for this user");
|
|
287
|
+
}
|
|
288
|
+
this.portals = portals;
|
|
289
|
+
logger.info("Portals fetched", { count: portals.length });
|
|
290
|
+
if (portals.length === 1) {
|
|
291
|
+
this.selectedPortal = portals[0];
|
|
292
|
+
logger.info("Auto-selected single portal", {
|
|
293
|
+
portalId: this.selectedPortal.id,
|
|
294
|
+
name: this.selectedPortal.name
|
|
295
|
+
});
|
|
296
|
+
await this.callOnPortalSelected(this.selectedPortal);
|
|
297
|
+
await this.handleSelectedPortal();
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
logger.info("Emitting portalsAvailable; awaiting consumer selectPortal()", { count: portals.length });
|
|
301
|
+
emit("portalsAvailable", createAgentEventResponse("portalsAvailable", { portals }));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Process the selected portal: resolve portal details + profiles, enrich
|
|
306
|
+
* the portal name, then branch to agent selection (Flow B) or profile
|
|
307
|
+
* resolution (Flow A).
|
|
308
|
+
*/
|
|
309
|
+
async handleSelectedPortal() {
|
|
310
|
+
if (this.destroyed)
|
|
311
|
+
return;
|
|
312
|
+
const { logger, agentDetails, initParams } = this.deps;
|
|
313
|
+
const portalId = this.selectedPortal.id;
|
|
314
|
+
const isCustomer = agentDetails?.userType === "customer" ||
|
|
315
|
+
initParams.authType?.trim().toLowerCase() === "customer";
|
|
316
|
+
const resolved = (await this.resolveProfilesFromCache(portalId)) ??
|
|
317
|
+
(isCustomer
|
|
318
|
+
? await this.resolveProfilesForCustomer(portalId)
|
|
319
|
+
: await this.resolveProfilesFromApi(portalId));
|
|
320
|
+
this.portalDetails = resolved.portalDetails;
|
|
321
|
+
this.profiles = resolved.profiles;
|
|
322
|
+
this.addPortalName();
|
|
323
|
+
logger.info("Portal details fetched", {
|
|
324
|
+
portalDetails: this.portalDetails
|
|
325
|
+
});
|
|
326
|
+
logger.info("User profiles fetched", { profiles: this.profiles });
|
|
327
|
+
logger.info("Department ID", {
|
|
328
|
+
departmentId: this.portalDetails?.departmentId
|
|
329
|
+
});
|
|
330
|
+
if (this.deps.isAgentSelectionMode) {
|
|
331
|
+
await this.fetchAndEmitAgents();
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
await this.handleSelectedAgent();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Fetch portal details from API. Swallows errors and returns undefined on failure. */
|
|
338
|
+
async fetchPortalDetails(portalId) {
|
|
339
|
+
const { apiHelper } = this.deps;
|
|
340
|
+
return ((await apiHelper
|
|
341
|
+
.getPortalDetails?.({ portalId: String(portalId) })
|
|
342
|
+
.catch(() => null)) ?? undefined);
|
|
343
|
+
}
|
|
344
|
+
/** Cache-hit strategy: return cached profiles with fresh portal details, or null if cache miss. */
|
|
345
|
+
async resolveProfilesFromCache(portalId) {
|
|
346
|
+
const key = this.deps.pipelineCache?.profilesKey(portalId) ?? "";
|
|
347
|
+
const cached = this.readCachedFromAdapter(key);
|
|
348
|
+
if (cached == null)
|
|
349
|
+
return null;
|
|
350
|
+
this.deps.logger.info("Using cached profiles", { count: cached.length });
|
|
351
|
+
const portalDetails = await this.fetchPortalDetails(portalId);
|
|
352
|
+
return { portalDetails, profiles: [...cached] };
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Customer strategy: fetch portal details only (skip getUserProfiles),
|
|
356
|
+
* extract defaultUserProfile from portal settings if present.
|
|
357
|
+
*/
|
|
358
|
+
async resolveProfilesForCustomer(portalId) {
|
|
359
|
+
const { logger } = this.deps;
|
|
360
|
+
logger.info("Customer profile mode: skipping getUserProfiles (cc-widget parity)");
|
|
361
|
+
const portalDetails = await this.fetchPortalDetails(portalId);
|
|
362
|
+
const profiles = this.extractCustomerProfileFromDetails(portalDetails);
|
|
363
|
+
return { portalDetails, profiles };
|
|
364
|
+
}
|
|
365
|
+
/** Normal strategy: fetch portal details and user profiles in parallel. */
|
|
366
|
+
async resolveProfilesFromApi(portalId) {
|
|
367
|
+
const { apiHelper } = this.deps;
|
|
368
|
+
const [portalDetails, profiles] = await Promise.all([
|
|
369
|
+
this.fetchPortalDetails(portalId),
|
|
370
|
+
apiHelper.getUserProfiles({ portalId })
|
|
371
|
+
]);
|
|
372
|
+
return { portalDetails, profiles: profiles ?? [] };
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Extract the default user profile from portal details for customer mode.
|
|
376
|
+
* Returns a single-element array if a valid default exists, otherwise empty.
|
|
377
|
+
*/
|
|
378
|
+
extractCustomerProfileFromDetails(portalDetails) {
|
|
379
|
+
const { logger } = this.deps;
|
|
380
|
+
const defaultFromPortal = portalDetails?.portal?.[0]?.portalSettings?.defaultUserProfile ??
|
|
381
|
+
portalDetails?.portalSettings?.defaultUserProfile;
|
|
382
|
+
if (defaultFromPortal != null &&
|
|
383
|
+
defaultFromPortal.id != null &&
|
|
384
|
+
defaultFromPortal.id !== "") {
|
|
385
|
+
logger.info("Customer profile mode: using default user profile from portal details", { profileId: defaultFromPortal.id });
|
|
386
|
+
return [defaultFromPortal];
|
|
387
|
+
}
|
|
388
|
+
return [];
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Enrich `selectedPortal.name` and the matching `portals[]` entry from
|
|
392
|
+
* the portal details API response (cc-widget portalService.handlePortalSelection parity).
|
|
393
|
+
*/
|
|
394
|
+
addPortalName() {
|
|
395
|
+
const portalDisplayName = this.portalDetails?.name ?? this.portalDetails?.portal?.[0]?.name;
|
|
396
|
+
if (portalDisplayName == null ||
|
|
397
|
+
String(portalDisplayName).trim() === "" ||
|
|
398
|
+
this.selectedPortal == null) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
const name = String(portalDisplayName).trim();
|
|
402
|
+
this.selectedPortal = { ...this.selectedPortal, name };
|
|
403
|
+
const idx = this.portals.findIndex((p) => sameId(p.id, this.selectedPortal.id));
|
|
404
|
+
if (idx >= 0) {
|
|
405
|
+
this.portals[idx] = { ...this.portals[idx], name };
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Flow B: validate departmentId, fetch agents for the selected portal,
|
|
410
|
+
* then auto-select (single agent) or emit agentsAvailable.
|
|
411
|
+
*/
|
|
412
|
+
async fetchAndEmitAgents() {
|
|
413
|
+
const { apiHelper, logger, emit, createAgentEventResponse } = this.deps;
|
|
414
|
+
const departmentId = this.portalDetails?.departmentId;
|
|
415
|
+
if (!departmentId) {
|
|
416
|
+
throw new Error("Department ID required for agent selection but not found in portal");
|
|
417
|
+
}
|
|
418
|
+
this.agents = await apiHelper.getAgentsByPortal({
|
|
419
|
+
departmentId,
|
|
420
|
+
portalId: this.selectedPortal.id,
|
|
421
|
+
agentType: "contact-center"
|
|
422
|
+
});
|
|
423
|
+
logger.info("Agents fetched", { agents: this.agents });
|
|
424
|
+
if (!this.agents || this.agents.length === 0) {
|
|
425
|
+
throw new Error("No agents available for the selected portal");
|
|
426
|
+
}
|
|
427
|
+
if (this.agents.length === 1) {
|
|
428
|
+
this.selectedAgent = this.agents[0];
|
|
429
|
+
logger.info("Auto-selected single agent", {
|
|
430
|
+
agentId: this.selectedAgent?.agentId
|
|
431
|
+
});
|
|
432
|
+
await this.handleSelectedAgent();
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
emit("agentsAvailable", createAgentEventResponse("agentsAvailable", { agents: this.agents }));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Process the selected agent (or no agent in Flow A): resolve profile selection
|
|
440
|
+
* using priority logic, then chain to completeInitialization or emit profilesAvailable.
|
|
441
|
+
*/
|
|
442
|
+
async handleSelectedAgent() {
|
|
443
|
+
if (this.destroyed)
|
|
444
|
+
return;
|
|
445
|
+
const { logger, emit, createAgentEventResponse } = this.deps;
|
|
446
|
+
const resolved = this.resolveAutoProfile();
|
|
447
|
+
if (resolved) {
|
|
448
|
+
this.selectedProfile = resolved.profile;
|
|
449
|
+
logger.info("Profile auto-resolved", {
|
|
450
|
+
profileId: this.selectedProfile?.id,
|
|
451
|
+
portalId: this.selectedPortal?.id
|
|
452
|
+
});
|
|
453
|
+
await this.completeInitialization();
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
logger.info("Emitting profilesAvailable; awaiting consumer selectUserProfile()", { count: this.profiles.length });
|
|
457
|
+
emit("profilesAvailable", createAgentEventResponse("profilesAvailable", {
|
|
458
|
+
profiles: this.profiles,
|
|
459
|
+
selectedPortal: this.selectedPortal
|
|
460
|
+
}));
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Priority cascade for auto-selecting a profile.
|
|
465
|
+
* Returns `{ profile }` when one can be auto-selected (including `undefined`
|
|
466
|
+
* for the zero-profiles case), or `null` when the consumer must choose.
|
|
467
|
+
*
|
|
468
|
+
* Priority: no profiles → single → lastUsed → portalDefault → null (emit)
|
|
469
|
+
*/
|
|
470
|
+
resolveAutoProfile() {
|
|
471
|
+
const profiles = this.profiles;
|
|
472
|
+
if (!profiles || profiles.length === 0) {
|
|
473
|
+
return { profile: undefined };
|
|
474
|
+
}
|
|
475
|
+
if (profiles.length === 1) {
|
|
476
|
+
return { profile: profiles[0] };
|
|
477
|
+
}
|
|
478
|
+
const lastUsed = profiles.find((p) => p.isLastUsedInPortal);
|
|
479
|
+
if (lastUsed)
|
|
480
|
+
return { profile: lastUsed };
|
|
481
|
+
const defaultId = this.getDefaultProfileFromPortal();
|
|
482
|
+
if (defaultId != null) {
|
|
483
|
+
const defaultProfile = profiles.find((p) => String(p.id) === defaultId);
|
|
484
|
+
if (defaultProfile)
|
|
485
|
+
return { profile: defaultProfile };
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
/** Extract the default profile ID from the two possible portal details shapes. */
|
|
490
|
+
getDefaultProfileFromPortal() {
|
|
491
|
+
const id = this.portalDetails?.portal?.[0]?.portalSettings?.defaultUserProfile?.id ??
|
|
492
|
+
this.portalDetails?.portalSettings?.defaultUserProfile?.id;
|
|
493
|
+
return id != null ? String(id) : undefined;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Final pipeline step: persist profile selection and emit the initialized event
|
|
497
|
+
* with the full payload built from instance fields.
|
|
498
|
+
*/
|
|
499
|
+
async completeInitialization() {
|
|
500
|
+
if (this.destroyed)
|
|
501
|
+
return;
|
|
502
|
+
const { apiHelper, emit, createAgentEventResponse, agentDetails, initParams } = this.deps;
|
|
503
|
+
const selectedPortal = this.selectedPortal;
|
|
504
|
+
const selectedProfile = this.selectedProfile;
|
|
505
|
+
if (selectedProfile != null) {
|
|
506
|
+
// cc-widget: no PUT for customer; PUT for agent / authType user / legacy (no userType and no authType).
|
|
507
|
+
const authTypeLower = initParams.authType?.trim().toLowerCase();
|
|
508
|
+
const customerLike = agentDetails?.userType === "customer" || authTypeLower === "customer";
|
|
509
|
+
const legacyUnsetTyping = agentDetails?.userType == null &&
|
|
510
|
+
(authTypeLower == null || authTypeLower === "");
|
|
511
|
+
const callSelect = !customerLike &&
|
|
512
|
+
(agentDetails?.userType === "agent" ||
|
|
513
|
+
authTypeLower === "user" ||
|
|
514
|
+
legacyUnsetTyping);
|
|
515
|
+
if (callSelect) {
|
|
516
|
+
await apiHelper.selectUserProfile({
|
|
517
|
+
portalId: selectedPortal.id,
|
|
518
|
+
profileId: selectedProfile.id
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
// Build the payload for the initialized event
|
|
523
|
+
const payload = {
|
|
524
|
+
portal: selectedPortal,
|
|
525
|
+
availableProfiles: this.profiles ?? []
|
|
526
|
+
};
|
|
527
|
+
if (selectedProfile != null) {
|
|
528
|
+
payload.profile = selectedProfile;
|
|
529
|
+
}
|
|
530
|
+
if (this.portalDetails != null) {
|
|
531
|
+
payload.portalDetails = this.portalDetails;
|
|
532
|
+
}
|
|
533
|
+
if (this.portals.length > 0) {
|
|
534
|
+
payload.availablePortals = this.portals;
|
|
535
|
+
}
|
|
536
|
+
if (this.selectedAgent) {
|
|
537
|
+
const agent = this.agents.length > 0
|
|
538
|
+
? (this.agents.find((a) => a.agentId === this.selectedAgent.agentId) ?? this.selectedAgent)
|
|
539
|
+
: this.selectedAgent;
|
|
540
|
+
payload.agent = agent;
|
|
541
|
+
}
|
|
542
|
+
emit("initialized", createAgentEventResponse("initialized", payload));
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Call PCS.onPortalSelected() and store filter tags if returned.
|
|
546
|
+
* Best-effort: errors are logged as warnings and filter tags default to {}.
|
|
547
|
+
*/
|
|
548
|
+
async callOnPortalSelected(portal) {
|
|
549
|
+
const pcs = this.deps.platformComponentService;
|
|
550
|
+
if (!pcs?.onPortalSelected)
|
|
551
|
+
return;
|
|
552
|
+
try {
|
|
553
|
+
const result = await pcs.onPortalSelected(portal);
|
|
554
|
+
if (result && typeof result === "object" && !Array.isArray(result)) {
|
|
555
|
+
this.deps.hookContract?.setUserFilterTags(result);
|
|
556
|
+
this.deps.logger.debug("PCS.onPortalSelected stored filter tags", {
|
|
557
|
+
tags: result
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
catch (err) {
|
|
562
|
+
this.deps.logger.warn("PCS.onPortalSelected threw; filter tags defaulting to {}", err instanceof Error ? err : new Error(String(err)));
|
|
563
|
+
this.deps.hookContract?.setUserFilterTags({});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Called by AiAgent.selectPortal(). Stores the selected portal and triggers
|
|
568
|
+
* the next pipeline step (handleSelectedPortal).
|
|
569
|
+
*/
|
|
570
|
+
onPortalSelected(portal) {
|
|
571
|
+
if (this.destroyed)
|
|
572
|
+
return;
|
|
573
|
+
this.deps.logger.debug("onPortalSelected called", {
|
|
574
|
+
portalId: portal?.id,
|
|
575
|
+
name: portal?.name
|
|
576
|
+
});
|
|
577
|
+
if (this.portals.length > 0 &&
|
|
578
|
+
!this.portals.some((p) => sameId(p.id, portal?.id))) {
|
|
579
|
+
this.deps.logger.error("Selected portal is not in the available portals list", undefined, { portalId: portal?.id });
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
this.selectedPortal = portal;
|
|
583
|
+
this.callOnPortalSelected(portal)
|
|
584
|
+
.then(() => {
|
|
585
|
+
return this.handleSelectedPortal();
|
|
586
|
+
})
|
|
587
|
+
.catch((err) => {
|
|
588
|
+
this.deps.logger.error("Pipeline error after portal selection", err instanceof Error ? err : new Error(String(err)));
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Called by AiAgent.selectAgent(). Stores the selected agent and triggers
|
|
593
|
+
* the next pipeline step (handleSelectedAgent). Flow B only.
|
|
594
|
+
*/
|
|
595
|
+
onAgentSelected(agent) {
|
|
596
|
+
if (this.destroyed)
|
|
597
|
+
return;
|
|
598
|
+
if (this.agents.length > 0 &&
|
|
599
|
+
!this.agents.some((a) => sameId(a.agentId, agent?.agentId))) {
|
|
600
|
+
this.deps.logger.error("Selected agent is not in the available agents list", undefined, { agentId: agent?.agentId });
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
this.selectedAgent = agent;
|
|
604
|
+
// Trigger the next pipeline step (handleSelectedAgent)
|
|
605
|
+
this.handleSelectedAgent().catch((err) => {
|
|
606
|
+
this.deps.logger.error("Pipeline error after agent selection", err instanceof Error ? err : new Error(String(err)));
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Called by AiAgent.selectUserProfile(). Stores the selected profile and triggers
|
|
611
|
+
* the final pipeline step (completeInitialization).
|
|
612
|
+
*/
|
|
613
|
+
onProfileSelected(profile) {
|
|
614
|
+
if (this.destroyed)
|
|
615
|
+
return;
|
|
616
|
+
if (this.profiles.length > 0 &&
|
|
617
|
+
!this.profiles.some((p) => sameId(p.id, profile?.id))) {
|
|
618
|
+
this.deps.logger.error("Selected profile is not in the available profiles list", undefined, { profileId: profile?.id });
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
this.selectedProfile = profile;
|
|
622
|
+
// Trigger the final pipeline step (completeInitialization)
|
|
623
|
+
this.completeInitialization().catch((err) => {
|
|
624
|
+
this.deps.logger.error("Pipeline error after profile selection", err instanceof Error ? err : new Error(String(err)));
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Destroy the pipeline. Sets a destroyed flag so that any in-progress or
|
|
629
|
+
* future chained method calls are no-ops. After calling destroy(), the
|
|
630
|
+
* pipeline instance must not be reused.
|
|
631
|
+
*/
|
|
632
|
+
destroy() {
|
|
633
|
+
this.destroyed = true;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
//# sourceMappingURL=PortalInitializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortalInitializer.js","sourceRoot":"","sources":["../../../src/core/portal-initializer/PortalInitializer.ts"],"names":[],"mappings":"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"}
|