@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.
Files changed (164) hide show
  1. package/README.md +295 -0
  2. package/dist/browser.js +22739 -0
  3. package/dist/core/AiAgent.d.ts +1126 -0
  4. package/dist/core/AiAgent.d.ts.map +1 -0
  5. package/dist/core/AiAgent.js +2037 -0
  6. package/dist/core/AiAgent.js.map +1 -0
  7. package/dist/core/api/ApiHelper.d.ts +433 -0
  8. package/dist/core/api/ApiHelper.d.ts.map +1 -0
  9. package/dist/core/api/ApiHelper.js +689 -0
  10. package/dist/core/api/ApiHelper.js.map +1 -0
  11. package/dist/core/api/CacheAdapter.d.ts +295 -0
  12. package/dist/core/api/CacheAdapter.d.ts.map +1 -0
  13. package/dist/core/api/CacheAdapter.js +298 -0
  14. package/dist/core/api/CacheAdapter.js.map +1 -0
  15. package/dist/core/auth/AnonymousAuthStrategy.d.ts +87 -0
  16. package/dist/core/auth/AnonymousAuthStrategy.d.ts.map +1 -0
  17. package/dist/core/auth/AnonymousAuthStrategy.js +257 -0
  18. package/dist/core/auth/AnonymousAuthStrategy.js.map +1 -0
  19. package/dist/core/auth/AuthProvider.d.ts +13 -0
  20. package/dist/core/auth/AuthProvider.d.ts.map +1 -0
  21. package/dist/core/auth/AuthProvider.js +2 -0
  22. package/dist/core/auth/AuthProvider.js.map +1 -0
  23. package/dist/core/auth/AuthStrategy.d.ts +74 -0
  24. package/dist/core/auth/AuthStrategy.d.ts.map +1 -0
  25. package/dist/core/auth/AuthStrategy.js +2 -0
  26. package/dist/core/auth/AuthStrategy.js.map +1 -0
  27. package/dist/core/auth/AuthenticationService.d.ts +226 -0
  28. package/dist/core/auth/AuthenticationService.d.ts.map +1 -0
  29. package/dist/core/auth/AuthenticationService.js +344 -0
  30. package/dist/core/auth/AuthenticationService.js.map +1 -0
  31. package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts +62 -0
  32. package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts.map +1 -0
  33. package/dist/core/auth/ClientCredentialsAuthStrategy.js +78 -0
  34. package/dist/core/auth/ClientCredentialsAuthStrategy.js.map +1 -0
  35. package/dist/core/auth/PKCEAuthStrategy.d.ts +136 -0
  36. package/dist/core/auth/PKCEAuthStrategy.d.ts.map +1 -0
  37. package/dist/core/auth/PKCEAuthStrategy.js +409 -0
  38. package/dist/core/auth/PKCEAuthStrategy.js.map +1 -0
  39. package/dist/core/auth/PreAuthStrategy.d.ts +101 -0
  40. package/dist/core/auth/PreAuthStrategy.d.ts.map +1 -0
  41. package/dist/core/auth/PreAuthStrategy.js +216 -0
  42. package/dist/core/auth/PreAuthStrategy.js.map +1 -0
  43. package/dist/core/auth/msal-browser.js +19683 -0
  44. package/dist/core/auth/msal-loader.d.ts +14 -0
  45. package/dist/core/auth/msal-loader.d.ts.map +1 -0
  46. package/dist/core/auth/msal-loader.js +43 -0
  47. package/dist/core/auth/msal-loader.js.map +1 -0
  48. package/dist/core/connection/Connection.d.ts +168 -0
  49. package/dist/core/connection/Connection.d.ts.map +1 -0
  50. package/dist/core/connection/Connection.js +290 -0
  51. package/dist/core/connection/Connection.js.map +1 -0
  52. package/dist/core/connection/ConnectionState.d.ts +11 -0
  53. package/dist/core/connection/ConnectionState.d.ts.map +1 -0
  54. package/dist/core/connection/ConnectionState.js +12 -0
  55. package/dist/core/connection/ConnectionState.js.map +1 -0
  56. package/dist/core/connection/Transport.d.ts +98 -0
  57. package/dist/core/connection/Transport.d.ts.map +1 -0
  58. package/dist/core/connection/Transport.js +27 -0
  59. package/dist/core/connection/Transport.js.map +1 -0
  60. package/dist/core/connection/WebSocketTransport.d.ts +65 -0
  61. package/dist/core/connection/WebSocketTransport.d.ts.map +1 -0
  62. package/dist/core/connection/WebSocketTransport.js +177 -0
  63. package/dist/core/connection/WebSocketTransport.js.map +1 -0
  64. package/dist/core/errors/SDKError.d.ts +27 -0
  65. package/dist/core/errors/SDKError.d.ts.map +1 -0
  66. package/dist/core/errors/SDKError.js +43 -0
  67. package/dist/core/errors/SDKError.js.map +1 -0
  68. package/dist/core/events/EventEmitter.d.ts +120 -0
  69. package/dist/core/events/EventEmitter.d.ts.map +1 -0
  70. package/dist/core/events/EventEmitter.js +183 -0
  71. package/dist/core/events/EventEmitter.js.map +1 -0
  72. package/dist/core/logging/LogLevel.d.ts +33 -0
  73. package/dist/core/logging/LogLevel.d.ts.map +1 -0
  74. package/dist/core/logging/LogLevel.js +40 -0
  75. package/dist/core/logging/LogLevel.js.map +1 -0
  76. package/dist/core/logging/Logger.d.ts +120 -0
  77. package/dist/core/logging/Logger.d.ts.map +1 -0
  78. package/dist/core/logging/Logger.js +204 -0
  79. package/dist/core/logging/Logger.js.map +1 -0
  80. package/dist/core/logging/globalLogger.d.ts +8 -0
  81. package/dist/core/logging/globalLogger.d.ts.map +1 -0
  82. package/dist/core/logging/globalLogger.js +12 -0
  83. package/dist/core/logging/globalLogger.js.map +1 -0
  84. package/dist/core/logging/types.d.ts +45 -0
  85. package/dist/core/logging/types.d.ts.map +1 -0
  86. package/dist/core/logging/types.js +2 -0
  87. package/dist/core/logging/types.js.map +1 -0
  88. package/dist/core/message/BaseMessageHandler.d.ts +208 -0
  89. package/dist/core/message/BaseMessageHandler.d.ts.map +1 -0
  90. package/dist/core/message/BaseMessageHandler.js +155 -0
  91. package/dist/core/message/BaseMessageHandler.js.map +1 -0
  92. package/dist/core/message/Message.d.ts +69 -0
  93. package/dist/core/message/Message.d.ts.map +1 -0
  94. package/dist/core/message/Message.js +131 -0
  95. package/dist/core/message/Message.js.map +1 -0
  96. package/dist/core/message/MessageProcessor.d.ts +51 -0
  97. package/dist/core/message/MessageProcessor.d.ts.map +1 -0
  98. package/dist/core/message/MessageProcessor.js +123 -0
  99. package/dist/core/message/MessageProcessor.js.map +1 -0
  100. package/dist/core/message/MessageTypes.d.ts +123 -0
  101. package/dist/core/message/MessageTypes.d.ts.map +1 -0
  102. package/dist/core/message/MessageTypes.js +106 -0
  103. package/dist/core/message/MessageTypes.js.map +1 -0
  104. package/dist/core/message/Transcript.d.ts +373 -0
  105. package/dist/core/message/Transcript.d.ts.map +1 -0
  106. package/dist/core/message/Transcript.js +355 -0
  107. package/dist/core/message/Transcript.js.map +1 -0
  108. package/dist/core/message/handlers/AgentMessageHandler.d.ts +26 -0
  109. package/dist/core/message/handlers/AgentMessageHandler.d.ts.map +1 -0
  110. package/dist/core/message/handlers/AgentMessageHandler.js +130 -0
  111. package/dist/core/message/handlers/AgentMessageHandler.js.map +1 -0
  112. package/dist/core/message/handlers/ChatHistoryHandler.d.ts +12 -0
  113. package/dist/core/message/handlers/ChatHistoryHandler.d.ts.map +1 -0
  114. package/dist/core/message/handlers/ChatHistoryHandler.js +49 -0
  115. package/dist/core/message/handlers/ChatHistoryHandler.js.map +1 -0
  116. package/dist/core/message/handlers/ErrorMessageHandler.d.ts +12 -0
  117. package/dist/core/message/handlers/ErrorMessageHandler.d.ts.map +1 -0
  118. package/dist/core/message/handlers/ErrorMessageHandler.js +49 -0
  119. package/dist/core/message/handlers/ErrorMessageHandler.js.map +1 -0
  120. package/dist/core/message/handlers/HeartbeatHandler.d.ts +12 -0
  121. package/dist/core/message/handlers/HeartbeatHandler.d.ts.map +1 -0
  122. package/dist/core/message/handlers/HeartbeatHandler.js +46 -0
  123. package/dist/core/message/handlers/HeartbeatHandler.js.map +1 -0
  124. package/dist/core/message/handlers/TokenRefreshHandler.d.ts +30 -0
  125. package/dist/core/message/handlers/TokenRefreshHandler.d.ts.map +1 -0
  126. package/dist/core/message/handlers/TokenRefreshHandler.js +84 -0
  127. package/dist/core/message/handlers/TokenRefreshHandler.js.map +1 -0
  128. package/dist/core/message/types.d.ts +107 -0
  129. package/dist/core/message/types.d.ts.map +1 -0
  130. package/dist/core/message/types.js +30 -0
  131. package/dist/core/message/types.js.map +1 -0
  132. package/dist/core/platform/HookContract.d.ts +112 -0
  133. package/dist/core/platform/HookContract.d.ts.map +1 -0
  134. package/dist/core/platform/HookContract.js +13 -0
  135. package/dist/core/platform/HookContract.js.map +1 -0
  136. package/dist/core/platform/PlatformComponentService.d.ts +40 -0
  137. package/dist/core/platform/PlatformComponentService.d.ts.map +1 -0
  138. package/dist/core/platform/PlatformComponentService.js +12 -0
  139. package/dist/core/platform/PlatformComponentService.js.map +1 -0
  140. package/dist/core/platform/PlatformScriptLoader.d.ts +41 -0
  141. package/dist/core/platform/PlatformScriptLoader.d.ts.map +1 -0
  142. package/dist/core/platform/PlatformScriptLoader.js +110 -0
  143. package/dist/core/platform/PlatformScriptLoader.js.map +1 -0
  144. package/dist/core/polyfills.d.ts +16 -0
  145. package/dist/core/polyfills.d.ts.map +1 -0
  146. package/dist/core/polyfills.js +168 -0
  147. package/dist/core/polyfills.js.map +1 -0
  148. package/dist/core/portal-initializer/PortalInitializer.d.ts +234 -0
  149. package/dist/core/portal-initializer/PortalInitializer.d.ts.map +1 -0
  150. package/dist/core/portal-initializer/PortalInitializer.js +636 -0
  151. package/dist/core/portal-initializer/PortalInitializer.js.map +1 -0
  152. package/dist/core/queue/MessageQueue.d.ts +277 -0
  153. package/dist/core/queue/MessageQueue.d.ts.map +1 -0
  154. package/dist/core/queue/MessageQueue.js +291 -0
  155. package/dist/core/queue/MessageQueue.js.map +1 -0
  156. package/dist/core/types/PortalTypes.d.ts +51 -0
  157. package/dist/core/types/PortalTypes.d.ts.map +1 -0
  158. package/dist/core/types/PortalTypes.js +8 -0
  159. package/dist/core/types/PortalTypes.js.map +1 -0
  160. package/dist/index.d.ts +91 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +82 -0
  163. package/dist/index.js.map +1 -0
  164. 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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"}