@posiwise/common-services 0.2.25 → 0.2.27

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.
@@ -2,24 +2,24 @@ import * as i0 from '@angular/core';
2
2
  import { DOCUMENT, Inject, Injectable, isDevMode, inject, NgModule, ViewEncapsulation } from '@angular/core';
3
3
  import * as i3 from '@angular/router';
4
4
  import { NavigationEnd } from '@angular/router';
5
- import * as i2 from '@posiwise/app-config-service';
5
+ import * as i1 from '@posiwise/app-config-service';
6
6
  import { AppConfigService } from '@posiwise/app-config-service';
7
- import * as i1$1 from '@angular/common/http';
7
+ import * as i1$2 from '@angular/common/http';
8
8
  import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
9
- import { throwError, of, BehaviorSubject, tap, timer } from 'rxjs';
10
- import { catchError, take, tap as tap$1, switchMap, map, mergeMap, distinctUntilChanged } from 'rxjs/operators';
9
+ import { throwError, of, BehaviorSubject, tap, timer, defer } from 'rxjs';
10
+ import { catchError, take, tap as tap$1, switchMap, map, mergeMap, distinctUntilChanged, retry, filter } from 'rxjs/operators';
11
11
  import { HelperService } from '@posiwise/helper-service';
12
- import * as i1 from 'ngx-toastr';
12
+ import * as i1$1 from 'ngx-toastr';
13
13
  import { CommonModule } from '@angular/common';
14
14
  import { getUser, SetUser, UserActionTypes, appReducers } from '@posiwise/app-store';
15
- import * as i1$2 from '@ngrx/effects';
15
+ import * as i1$3 from '@ngrx/effects';
16
16
  import { Actions, createEffect, ofType, EffectsModule } from '@ngrx/effects';
17
- import * as i3$1 from '@ngrx/store';
17
+ import * as i2 from '@ngrx/store';
18
18
  import { StoreModule } from '@ngrx/store';
19
19
  import { INTEGRATIONS_API_PREFIX, MAIN_API_PREFIX, PROJECT_PATH, USER_PATH, TOKEN_HEADER_KEY, NEWSLETTER_CONFIRMATION_PATH, NEWSLETTER_UNSUBSCRIBE_PATH, CAPTCHA_VALIDATION_PATH, SOCIAL_LOGIN_PATH, TOKEN_KEY, PERMISSION_NAMES, ADMIN_SUB_MENU_WHITELIST, AB_TEST_ACTIONS, GEO_PATH, PRODUCT_PATH, CONTACT_US_PATH, INCIDENTS_PATH, INCIDENTS_PATH_ADMIN, NEWSLETTERS_PATH, NEWSLETTER_SUBSCRIPTION_PATH, ADMIN_FAQS_PATH, FAQS_PATH, ORGANIZATIONS_PATH, GLOBAL_SUBSCRIPTION_CONFIGS_PATH, GLOBAL_CONFIGS_PATH, USER_LOGIN_NOTIFICATION, FEEDBACK_QUESTIONS_PATH, USER_FEEDBACKS_PATH, CUSTOMER_SUPPORT_PATH, ADMIN_TAG_PATH, ADMIN_TAG_CATEGORIES_PATH, ADMIN_PATH, QUALIFICATIONS_PATH, BRAIN_API_PREFIX, SOCKET_TYPE } from '@posiwise/common-utilities';
20
20
  import swal from 'sweetalert2';
21
21
  import moment from 'moment';
22
- import * as i1$3 from '@angular/platform-browser';
22
+ import * as i1$4 from '@angular/platform-browser';
23
23
  import cloneDeep from 'lodash/cloneDeep';
24
24
  import pickBy from 'lodash/pickBy';
25
25
  import * as i2$1 from 'ngx-cookie';
@@ -227,12 +227,12 @@ class GoogleAnalyticsService {
227
227
  this.subscription.unsubscribe();
228
228
  }
229
229
  }
230
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: GoogleAnalyticsService, deps: [{ token: i3.Router }, { token: ScriptLoaderService }, { token: i2.AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: GoogleAnalyticsService, deps: [{ token: i3.Router }, { token: ScriptLoaderService }, { token: i1.AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
231
231
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: GoogleAnalyticsService }); }
232
232
  }
233
233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: GoogleAnalyticsService, decorators: [{
234
234
  type: Injectable
235
- }], ctorParameters: () => [{ type: i3.Router }, { type: ScriptLoaderService }, { type: i2.AppConfigService }] });
235
+ }], ctorParameters: () => [{ type: i3.Router }, { type: ScriptLoaderService }, { type: i1.AppConfigService }] });
236
236
 
237
237
  class CustomToastService {
238
238
  constructor(toastr) {
@@ -240,13 +240,13 @@ class CustomToastService {
240
240
  }
241
241
  success(message, title = '', options = {}) {
242
242
  if (message) {
243
- this.toastr.success(message, title, { ...options, timeOut: 10000 });
243
+ this.toastr.success(message, title, { ...options, timeOut: 5000 });
244
244
  }
245
245
  }
246
246
  error(message, title = '', options = {}) {
247
247
  options = {
248
248
  ...options,
249
- timeOut: 20000
249
+ timeOut: 8000
250
250
  };
251
251
  if (message) {
252
252
  this.toastr.error(message, title, options);
@@ -254,7 +254,7 @@ class CustomToastService {
254
254
  }
255
255
  info(message, title = '', options = {}) {
256
256
  // disable auto timeout, toast would close on click (to disable auto timeout please use this attribute disableTimeOut:true in options)
257
- options = { ...options, timeOut: 30000, enableHtml: true };
257
+ options = { ...options, timeOut: 5000, enableHtml: true };
258
258
  if (message) {
259
259
  this.toastr.info(`<div class="d-flex align-items-center">
260
260
  <i class="fa fa-info-circle" aria-hidden="true"></i>
@@ -264,7 +264,7 @@ class CustomToastService {
264
264
  }
265
265
  warning(message, title = '', options = {}) {
266
266
  // disable auto timeout, toast would close on click (to disable auto timeout please use this attribute disableTimeOut:true in options)
267
- options = { ...options, timeOut: 30000 };
267
+ options = { ...options, timeOut: 6000 };
268
268
  if (message) {
269
269
  this.toastr.warning(message, title, options);
270
270
  }
@@ -304,7 +304,7 @@ class CustomToastService {
304
304
  this.error(message);
305
305
  }
306
306
  }
307
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CustomToastService, deps: [{ token: i1.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable }); }
307
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CustomToastService, deps: [{ token: i1$1.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable }); }
308
308
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CustomToastService, providedIn: 'root' }); }
309
309
  }
310
310
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CustomToastService, decorators: [{
@@ -312,7 +312,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
312
312
  args: [{
313
313
  providedIn: 'root'
314
314
  }]
315
- }], ctorParameters: () => [{ type: i1.ToastrService }] });
315
+ }], ctorParameters: () => [{ type: i1$1.ToastrService }] });
316
316
 
317
317
  /* eslint-disable @typescript-eslint/no-explicit-any */
318
318
  class BaseHttpService {
@@ -323,8 +323,14 @@ class BaseHttpService {
323
323
  this.getConfig();
324
324
  this.toast = injector.get(CustomToastService);
325
325
  }
326
+ buildUrl(url) {
327
+ // Collapse any run of 2+ slashes (arises when baseUrl ends with '/'
328
+ // and the caller path also starts with '/', sometimes twice) down to
329
+ // one, while preserving the '://' of an absolute URL scheme.
330
+ return `${this.baseUrl}${url}`.replace(/([^:]\/)\/+/g, '$1');
331
+ }
326
332
  get(url) {
327
- return this.http.get(`${this.baseUrl}${url}`).pipe(catchError(error => {
333
+ return this.http.get(this.buildUrl(url)).pipe(catchError(error => {
328
334
  this.handleError(error);
329
335
  return throwError(() => new HttpErrorResponse(error));
330
336
  }));
@@ -338,31 +344,31 @@ class BaseHttpService {
338
344
  delete params[k];
339
345
  }
340
346
  }
341
- return this.http.get(`${this.baseUrl}${url}`, { params }).pipe(catchError(error => {
347
+ return this.http.get(this.buildUrl(url), { params }).pipe(catchError(error => {
342
348
  this.handleError(error);
343
349
  return throwError(() => new HttpErrorResponse(error));
344
350
  }));
345
351
  }
346
352
  post(url, params = {}) {
347
- return this.http.post(`${this.baseUrl}${url}`, params).pipe(catchError(error => {
353
+ return this.http.post(this.buildUrl(url), params).pipe(catchError(error => {
348
354
  this.handleError(error);
349
355
  return throwError(() => new HttpErrorResponse(error));
350
356
  }));
351
357
  }
352
358
  put(url, params = {}) {
353
- return this.http.put(`${this.baseUrl}${url}`, params).pipe(catchError(error => {
359
+ return this.http.put(this.buildUrl(url), params).pipe(catchError(error => {
354
360
  this.handleError(error);
355
361
  return throwError(() => new HttpErrorResponse(error));
356
362
  }));
357
363
  }
358
364
  patch(url, params = {}) {
359
- return this.http.patch(`${this.baseUrl}${url}`, params).pipe(catchError(error => {
365
+ return this.http.patch(this.buildUrl(url), params).pipe(catchError(error => {
360
366
  this.handleError(error);
361
367
  return throwError(() => new HttpErrorResponse(error));
362
368
  }));
363
369
  }
364
370
  delete(url, option = {}) {
365
- return this.http.delete(`${this.baseUrl}${url}`, option).pipe(catchError(error => {
371
+ return this.http.delete(this.buildUrl(url), option).pipe(catchError(error => {
366
372
  this.handleError(error);
367
373
  return throwError(() => new HttpErrorResponse(error));
368
374
  }));
@@ -371,7 +377,7 @@ class BaseHttpService {
371
377
  const formData = new FormData();
372
378
  formData.append(param, file);
373
379
  const headers = new HttpHeaders({ enctype: 'multipart/form-data' });
374
- return this.http.put(`${this.baseUrl}${url}`, formData, { headers }).pipe(catchError(error => {
380
+ return this.http.put(this.buildUrl(url), formData, { headers }).pipe(catchError(error => {
375
381
  this.handleError(error);
376
382
  return throwError(() => new HttpErrorResponse(error));
377
383
  }));
@@ -385,7 +391,7 @@ class BaseHttpService {
385
391
  }
386
392
  }
387
393
  const headers = new HttpHeaders({ enctype: 'multipart/form-data' });
388
- return this.http.post(`${this.baseUrl}${url}`, formData, { headers }).pipe(catchError(error => {
394
+ return this.http.post(this.buildUrl(url), formData, { headers }).pipe(catchError(error => {
389
395
  this.handleError(error);
390
396
  return throwError(() => new HttpErrorResponse(error));
391
397
  }));
@@ -398,12 +404,12 @@ class BaseHttpService {
398
404
  this.toast.showToast(error);
399
405
  }
400
406
  }
401
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BaseHttpService, deps: [{ token: i1$1.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
407
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BaseHttpService, deps: [{ token: i1$2.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
402
408
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BaseHttpService }); }
403
409
  }
404
410
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BaseHttpService, decorators: [{
405
411
  type: Injectable
406
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i0.Injector }] });
412
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i0.Injector }] });
407
413
 
408
414
  class IntegrationsApiHttpService extends BaseHttpService {
409
415
  constructor(http, injector) {
@@ -416,7 +422,7 @@ class IntegrationsApiHttpService extends BaseHttpService {
416
422
  : config?.['links']?.integrations_api;
417
423
  });
418
424
  }
419
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: IntegrationsApiHttpService, deps: [{ token: i1$1.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
425
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: IntegrationsApiHttpService, deps: [{ token: i1$2.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
420
426
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: IntegrationsApiHttpService, providedIn: 'root' }); }
421
427
  }
422
428
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: IntegrationsApiHttpService, decorators: [{
@@ -424,7 +430,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
424
430
  args: [{
425
431
  providedIn: 'root'
426
432
  }]
427
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i0.Injector }] });
433
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i0.Injector }] });
428
434
 
429
435
  class LocalStorage {
430
436
  getItem$(key) {
@@ -464,7 +470,7 @@ class MainApiHttpService extends BaseHttpService {
464
470
  this.baseUrl = isDevMode() ? MAIN_API_PREFIX : config?.['links']?.main_api;
465
471
  });
466
472
  }
467
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MainApiHttpService, deps: [{ token: i1$1.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MainApiHttpService, deps: [{ token: i1$2.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
468
474
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MainApiHttpService, providedIn: 'root' }); }
469
475
  }
470
476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MainApiHttpService, decorators: [{
@@ -472,7 +478,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
472
478
  args: [{
473
479
  providedIn: 'root'
474
480
  }]
475
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i0.Injector }] });
481
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i0.Injector }] });
476
482
 
477
483
  /**
478
484
  * Secure Token Storage Service
@@ -698,11 +704,11 @@ class SecureTokenStorageService {
698
704
  }
699
705
  return null;
700
706
  }
701
- /**
702
- * Delete cookie
703
- */
707
+ // Attributes MUST mirror setSecureCookie — browsers require matching
708
+ // Secure + SameSite for the delete to take effect on HTTPS.
704
709
  deleteCookie(name) {
705
- this.document.cookie = `${name}=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
710
+ const isSecure = this.document.location.protocol === 'https:';
711
+ this.document.cookie = `${name}=; Path=/; ${isSecure ? 'Secure; ' : ''}SameSite=Strict; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
706
712
  }
707
713
  /**
708
714
  * Initialize tokens from storage on service startup
@@ -1007,7 +1013,7 @@ class UserService {
1007
1013
  refreshUserApiTokens() {
1008
1014
  return this.api.get(`${this.endpoint}/refresh_user_api_tokens`);
1009
1015
  }
1010
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: UserService, deps: [{ token: MainApiHttpService }, { token: i3$1.Store }, { token: i3.Router }, { token: i2.AppConfigService }, { token: ProfileService }, { token: CustomToastService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1016
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: UserService, deps: [{ token: MainApiHttpService }, { token: i2.Store }, { token: i3.Router }, { token: i1.AppConfigService }, { token: ProfileService }, { token: CustomToastService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1011
1017
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: UserService, providedIn: 'root' }); }
1012
1018
  }
1013
1019
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: UserService, decorators: [{
@@ -1015,7 +1021,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
1015
1021
  args: [{
1016
1022
  providedIn: 'root'
1017
1023
  }]
1018
- }], ctorParameters: () => [{ type: MainApiHttpService }, { type: i3$1.Store }, { type: i3.Router }, { type: i2.AppConfigService }, { type: ProfileService }, { type: CustomToastService }] });
1024
+ }], ctorParameters: () => [{ type: MainApiHttpService }, { type: i2.Store }, { type: i3.Router }, { type: i1.AppConfigService }, { type: ProfileService }, { type: CustomToastService }] });
1019
1025
 
1020
1026
  class AuthService {
1021
1027
  constructor(localStorage, secureTokenStorage, router, http, userService, toastr, appConfigService, integrationsApi, document) {
@@ -1394,12 +1400,12 @@ class AuthService {
1394
1400
  }
1395
1401
  });
1396
1402
  }
1397
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AuthService, deps: [{ token: LocalStorage }, { token: SecureTokenStorageService }, { token: i3.Router }, { token: MainApiHttpService }, { token: UserService }, { token: CustomToastService }, { token: i2.AppConfigService }, { token: IntegrationsApiHttpService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1403
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AuthService, deps: [{ token: LocalStorage }, { token: SecureTokenStorageService }, { token: i3.Router }, { token: MainApiHttpService }, { token: UserService }, { token: CustomToastService }, { token: i1.AppConfigService }, { token: IntegrationsApiHttpService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1398
1404
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AuthService }); }
1399
1405
  }
1400
1406
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AuthService, decorators: [{
1401
1407
  type: Injectable
1402
- }], ctorParameters: () => [{ type: LocalStorage }, { type: SecureTokenStorageService }, { type: i3.Router }, { type: MainApiHttpService }, { type: UserService }, { type: CustomToastService }, { type: i2.AppConfigService }, { type: IntegrationsApiHttpService }, { type: Document, decorators: [{
1408
+ }], ctorParameters: () => [{ type: LocalStorage }, { type: SecureTokenStorageService }, { type: i3.Router }, { type: MainApiHttpService }, { type: UserService }, { type: CustomToastService }, { type: i1.AppConfigService }, { type: IntegrationsApiHttpService }, { type: Document, decorators: [{
1403
1409
  type: Inject,
1404
1410
  args: [DOCUMENT]
1405
1411
  }] }] });
@@ -1426,7 +1432,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
1426
1432
 
1427
1433
  class CommonServicesModule {
1428
1434
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CommonServicesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1429
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.6", ngImport: i0, type: CommonServicesModule, imports: [CommonModule, i1$2.EffectsRootModule, i3$1.StoreRootModule] }); }
1435
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.6", ngImport: i0, type: CommonServicesModule, imports: [CommonModule, i1$3.EffectsRootModule, i2.StoreRootModule] }); }
1430
1436
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CommonServicesModule, providers: [AuthService], imports: [CommonModule, EffectsModule.forRoot([UserEffects]), StoreModule.forRoot(appReducers)] }); }
1431
1437
  }
1432
1438
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: CommonServicesModule, decorators: [{
@@ -1466,7 +1472,7 @@ class SeoService {
1466
1472
  this.meta.updateTag({ name: 'twitter:description', content: description });
1467
1473
  this.meta.updateTag({ name: 'twitter:card', content: 'summary' });
1468
1474
  }
1469
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SeoService, deps: [{ token: i1$3.Meta }, { token: i1$3.Title }], target: i0.ɵɵFactoryTarget.Injectable }); }
1475
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SeoService, deps: [{ token: i1$4.Meta }, { token: i1$4.Title }], target: i0.ɵɵFactoryTarget.Injectable }); }
1470
1476
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SeoService, providedIn: 'root' }); }
1471
1477
  }
1472
1478
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SeoService, decorators: [{
@@ -1474,7 +1480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
1474
1480
  args: [{
1475
1481
  providedIn: 'root'
1476
1482
  }]
1477
- }], ctorParameters: () => [{ type: i1$3.Meta }, { type: i1$3.Title }] });
1483
+ }], ctorParameters: () => [{ type: i1$4.Meta }, { type: i1$4.Title }] });
1478
1484
 
1479
1485
  /**
1480
1486
  * Centralized feature flag evaluation service.
@@ -1932,7 +1938,7 @@ class AbTestService {
1932
1938
  ? this.injector.get(service)
1933
1939
  : this.injector.get(MainApiHttpService);
1934
1940
  }
1935
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AbTestService, deps: [{ token: i0.Injector }, { token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
1941
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AbTestService, deps: [{ token: i0.Injector }, { token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
1936
1942
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AbTestService, providedIn: 'root' }); }
1937
1943
  }
1938
1944
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AbTestService, decorators: [{
@@ -1940,7 +1946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
1940
1946
  args: [{
1941
1947
  providedIn: 'root'
1942
1948
  }]
1943
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1$1.HttpClient }] });
1949
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1$2.HttpClient }] });
1944
1950
 
1945
1951
  class GeoService {
1946
1952
  constructor(api, cookieService) {
@@ -2249,11 +2255,17 @@ class AhoyService {
2249
2255
  this.ahoy = '/ahoy';
2250
2256
  this.toast = injector.get(CustomToastService);
2251
2257
  }
2258
+ // AhoyService does not extend BaseHttpService, so it needs its own
2259
+ // slash normalization: the micro-service base URL ends with '/' and the
2260
+ // path segments below start with '/', producing '/main-api/v1//versions'.
2261
+ buildUrl(url) {
2262
+ return url.replace(/([^:]\/)\/+/g, '$1');
2263
+ }
2252
2264
  getAhoyEvents(params, service, paging) {
2253
2265
  const baseUrl = HelperService.getBaseUrlMicroService(service);
2254
2266
  const page = HelperService.getPagingParams(paging);
2255
2267
  return this.http
2256
- .get(`${baseUrl}${this.ahoy}/events`, {
2268
+ .get(this.buildUrl(`${baseUrl}${this.ahoy}/events`), {
2257
2269
  params: { ...page, ...params }
2258
2270
  })
2259
2271
  .pipe(catchError(error => {
@@ -2265,7 +2277,7 @@ class AhoyService {
2265
2277
  const baseUrl = HelperService.getBaseUrlMicroService(service);
2266
2278
  const page = HelperService.getPagingParams(paging);
2267
2279
  return this.http
2268
- .get(`${baseUrl}${this.ahoy}/messages`, {
2280
+ .get(this.buildUrl(`${baseUrl}${this.ahoy}/messages`), {
2269
2281
  params: { ...page, ...params }
2270
2282
  })
2271
2283
  .pipe(catchError(error => {
@@ -2277,7 +2289,7 @@ class AhoyService {
2277
2289
  const baseUrl = HelperService.getBaseUrlMicroService(service);
2278
2290
  const page = HelperService.getPagingParams(paging);
2279
2291
  return this.http
2280
- .get(`${baseUrl}${this.ahoy}/visits`, {
2292
+ .get(this.buildUrl(`${baseUrl}${this.ahoy}/visits`), {
2281
2293
  params: { ...page, ...params }
2282
2294
  })
2283
2295
  .pipe(catchError(error => {
@@ -2289,7 +2301,7 @@ class AhoyService {
2289
2301
  const baseUrl = HelperService.getBaseUrlMicroService(service);
2290
2302
  const page = HelperService.getPagingParams(paging);
2291
2303
  return this.http
2292
- .get(`${baseUrl}/versions/get_all`, {
2304
+ .get(this.buildUrl(`${baseUrl}/versions/get_all`), {
2293
2305
  params: { ...page, ...params }
2294
2306
  })
2295
2307
  .pipe(catchError(error => {
@@ -2301,7 +2313,7 @@ class AhoyService {
2301
2313
  const baseUrl = HelperService.getBaseUrlMicroService(service);
2302
2314
  const page = HelperService.getPagingParams(paging);
2303
2315
  return this.http
2304
- .get(`${baseUrl}/events/get_all`, {
2316
+ .get(this.buildUrl(`${baseUrl}/events/get_all`), {
2305
2317
  params: { ...page, ...params }
2306
2318
  })
2307
2319
  .pipe(catchError(error => {
@@ -2317,7 +2329,7 @@ class AhoyService {
2317
2329
  this.toast.showToast(error);
2318
2330
  }
2319
2331
  }
2320
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AhoyService, deps: [{ token: i1$1.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
2332
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AhoyService, deps: [{ token: i1$2.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
2321
2333
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AhoyService, providedIn: 'root' }); }
2322
2334
  }
2323
2335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AhoyService, decorators: [{
@@ -2325,7 +2337,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
2325
2337
  args: [{
2326
2338
  providedIn: 'root'
2327
2339
  }]
2328
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i0.Injector }] });
2340
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i0.Injector }] });
2329
2341
 
2330
2342
  class CommonService {
2331
2343
  constructor(api) {
@@ -2368,7 +2380,7 @@ class CommonService {
2368
2380
  return this.api.put(`${NEWSLETTER_SUBSCRIPTION_PATH}/${newsletterId}/toggle`, param);
2369
2381
  }
2370
2382
  unsubscribeNewsletter(token) {
2371
- return this.api.get(`/${NEWSLETTER_UNSUBSCRIBE_PATH}?token=${token}`);
2383
+ return this.api.get(`${NEWSLETTER_UNSUBSCRIBE_PATH}?token=${token}`);
2372
2384
  }
2373
2385
  // FAQ
2374
2386
  getFaq(params) {
@@ -2978,7 +2990,7 @@ class McpJsonRpcService {
2978
2990
  return res.result;
2979
2991
  }));
2980
2992
  }
2981
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: McpJsonRpcService, deps: [{ token: i1$1.HttpClient }, { token: i2.AppConfigService }, { token: i3$1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
2993
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: McpJsonRpcService, deps: [{ token: i1$2.HttpClient }, { token: i1.AppConfigService }, { token: i2.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
2982
2994
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: McpJsonRpcService, providedIn: 'root' }); }
2983
2995
  }
2984
2996
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: McpJsonRpcService, decorators: [{
@@ -2986,7 +2998,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
2986
2998
  args: [{
2987
2999
  providedIn: 'root'
2988
3000
  }]
2989
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2.AppConfigService }, { type: i3$1.Store }] });
3001
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i1.AppConfigService }, { type: i2.Store }] });
2990
3002
 
2991
3003
  /* eslint-disable @typescript-eslint/no-explicit-any */
2992
3004
  class MCPOrchestratorService {
@@ -3022,7 +3034,7 @@ class MCPOrchestratorService {
3022
3034
  }));
3023
3035
  return base$.pipe(switchMap(base => this.store.pipe(take(1), map((app) => this.pickApiCredentials(app.user?.currentUser ?? null)), switchMap(creds => {
3024
3036
  if (!creds) {
3025
- return throwError(() => new Error('PosiWise Brain needs API credentials. Go to /account/details to set or rotate your API keys, then open the active subscription from /account/subscriptions to refresh its credentials.'));
3037
+ return throwError(() => new Error('The assistant needs API credentials. Go to /account/details to set or rotate your API keys, then open the active subscription from /account/subscriptions to refresh its credentials.'));
3026
3038
  }
3027
3039
  return this.http.post(`${base}/${path}`, body, {
3028
3040
  headers: this.buildHeaders(creds)
@@ -3070,7 +3082,7 @@ class MCPOrchestratorService {
3070
3082
  }
3071
3083
  return h;
3072
3084
  }
3073
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MCPOrchestratorService, deps: [{ token: i1$1.HttpClient }, { token: i2.AppConfigService }, { token: i3$1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
3085
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MCPOrchestratorService, deps: [{ token: i1$2.HttpClient }, { token: i1.AppConfigService }, { token: i2.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
3074
3086
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MCPOrchestratorService, providedIn: 'root' }); }
3075
3087
  }
3076
3088
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: MCPOrchestratorService, decorators: [{
@@ -3078,7 +3090,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3078
3090
  args: [{
3079
3091
  providedIn: 'root'
3080
3092
  }]
3081
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2.AppConfigService }, { type: i3$1.Store }] });
3093
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i1.AppConfigService }, { type: i2.Store }] });
3082
3094
 
3083
3095
  class WebsocketService {
3084
3096
  constructor(appConfigService, authService) {
@@ -3091,7 +3103,7 @@ class WebsocketService {
3091
3103
  this.webSocket$ = this.webSocketSubject.asObservable().pipe(distinctUntilChanged());
3092
3104
  });
3093
3105
  }
3094
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: WebsocketService, deps: [{ token: i2.AppConfigService }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: WebsocketService, deps: [{ token: i1.AppConfigService }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3095
3107
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: WebsocketService, providedIn: 'root' }); }
3096
3108
  }
3097
3109
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: WebsocketService, decorators: [{
@@ -3099,7 +3111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3099
3111
  args: [{
3100
3112
  providedIn: 'root'
3101
3113
  }]
3102
- }], ctorParameters: () => [{ type: i2.AppConfigService }, { type: AuthService }] });
3114
+ }], ctorParameters: () => [{ type: i1.AppConfigService }, { type: AuthService }] });
3103
3115
 
3104
3116
  class NotificationService {
3105
3117
  constructor(api, toastrService, socketService) {
@@ -3160,6 +3172,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3160
3172
  }]
3161
3173
  }], ctorParameters: () => [{ type: MainApiHttpService }, { type: CustomToastService }, { type: WebsocketService }] });
3162
3174
 
3175
+ /**
3176
+ * Server→client push channel for the Posiwise Brain chat panel (ticket #45).
3177
+ *
3178
+ * Opens a WebSocket to `GET /brain-api/v1/ws`. brain-api subscribes the socket
3179
+ * to the user's Redis channel and forwards every message published via
3180
+ * `POST /brain-api/v1/ws/push` as a JSON frame. Mirrors the existing
3181
+ * `WebsocketService` (main-api Faye socket) in spirit, but talks to brain-api
3182
+ * and authenticates with the same user-token credentials the
3183
+ * `MCPOrchestratorService` sends as headers.
3184
+ *
3185
+ * Auth: a WebSocket upgrade can't carry custom headers from the browser, so
3186
+ * the three credential values are bundled into a single base64'd JSON
3187
+ * `session_token` query param. brain-api decodes it back into the headers its
3188
+ * canonical authenticator expects (close code 4401 if missing/invalid).
3189
+ *
3190
+ * Reconnect: nginx ingress cuts idle upstream connections at ~60s, and this
3191
+ * channel is mostly idle, so the stream auto-reconnects with a fixed backoff.
3192
+ * Each reconnect re-resolves credentials (via `defer`) so a rotated token is
3193
+ * picked up rather than replayed.
3194
+ */
3195
+ const RECONNECT_DELAY_MS = 5_000;
3196
+ const BRAIN_MESSAGE_EVENT = 'brain_message';
3197
+ class BrainSocketService {
3198
+ constructor(appConfigService, store) {
3199
+ this.appConfigService = appConfigService;
3200
+ this.store = store;
3201
+ }
3202
+ /**
3203
+ * Hot stream of assistant messages pushed by the server. Subscribe when the
3204
+ * chat panel mounts; unsubscribe (via `takeUntil`) when it tears down.
3205
+ */
3206
+ messages$() {
3207
+ return defer(() => this.buildSocketUrl$().pipe(switchMap(url => webSocket(url)))).pipe(retry({ delay: () => timer(RECONNECT_DELAY_MS) }), filter((frame) => !!frame && frame.event === BRAIN_MESSAGE_EVENT), map(frame => ({ id: frame.id, text: frame.data?.text ?? '' })), filter(message => !!message.text));
3208
+ }
3209
+ buildSocketUrl$() {
3210
+ return this.wsBase$().pipe(switchMap(base => this.store.pipe(take(1), map((app) => this.pickApiCredentials(app.user?.currentUser ?? null)), switchMap(creds => creds
3211
+ ? of(`${base}?session_token=${this.encodeBundle(creds)}`)
3212
+ : throwError(() => new Error('Brain socket needs API credentials.'))))));
3213
+ }
3214
+ /** Absolute `ws(s)://…/brain-api/v1/ws` base, dev (same-origin) or prod (links). */
3215
+ wsBase$() {
3216
+ if (isDevMode()) {
3217
+ const scheme = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
3218
+ const path = `${BRAIN_API_PREFIX.replace(/\/$/, '')}/ws`;
3219
+ return of(`${scheme}//${window.location.host}${path}`);
3220
+ }
3221
+ return this.appConfigService.appConfig$.pipe(take(1), switchMap(c => {
3222
+ const url = c?.links?.['brain_api'];
3223
+ if (typeof url === 'string' && url.trim()) {
3224
+ const wsBase = url.trim().replace(/\/$/, '').replace(/^http/, 'ws');
3225
+ return of(`${wsBase}/ws`);
3226
+ }
3227
+ return throwError(() => new Error('Brain API is not configured: set links.brain_api in app configuration.'));
3228
+ }));
3229
+ }
3230
+ /**
3231
+ * Same credential resolution as `MCPOrchestratorService.pickApiCredentials`
3232
+ * — token/userId from the active user, clientId from the active subscription.
3233
+ */
3234
+ pickApiCredentials(user) {
3235
+ if (!user) {
3236
+ return null;
3237
+ }
3238
+ const token = user.api_user_token ?? user.api_keys?.api_user_token;
3239
+ const userId = user.api_user_id ?? user.api_keys?.api_user_id;
3240
+ if (!token || !userId) {
3241
+ return null;
3242
+ }
3243
+ const clientId = PermissionService.selectedSubscription?.api_client_id;
3244
+ return { token, userId, clientId };
3245
+ }
3246
+ encodeBundle(creds) {
3247
+ const bundle = {
3248
+ api_user_token: creds.token,
3249
+ api_user_id: creds.userId
3250
+ };
3251
+ if (creds.clientId) {
3252
+ bundle['api_client_id'] = creds.clientId;
3253
+ }
3254
+ return encodeURIComponent(btoa(JSON.stringify(bundle)));
3255
+ }
3256
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainSocketService, deps: [{ token: i1.AppConfigService }, { token: i2.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
3257
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainSocketService, providedIn: 'root' }); }
3258
+ }
3259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainSocketService, decorators: [{
3260
+ type: Injectable,
3261
+ args: [{
3262
+ providedIn: 'root'
3263
+ }]
3264
+ }], ctorParameters: () => [{ type: i1.AppConfigService }, { type: i2.Store }] });
3265
+
3163
3266
  class DataService {
3164
3267
  constructor() {
3165
3268
  this.messageSource = new BehaviorSubject(0);
@@ -3647,7 +3750,7 @@ class SentryErrorHandler {
3647
3750
  console.error(error, e);
3648
3751
  }
3649
3752
  }
3650
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SentryErrorHandler, deps: [{ token: i2.AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3753
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SentryErrorHandler, deps: [{ token: i1.AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3651
3754
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SentryErrorHandler, providedIn: 'root' }); }
3652
3755
  }
3653
3756
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SentryErrorHandler, decorators: [{
@@ -3655,7 +3758,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3655
3758
  args: [{
3656
3759
  providedIn: 'root'
3657
3760
  }]
3658
- }], ctorParameters: () => [{ type: i2.AppConfigService }] });
3761
+ }], ctorParameters: () => [{ type: i1.AppConfigService }] });
3659
3762
 
3660
3763
  class LogoCacheService {
3661
3764
  constructor() {
@@ -3771,7 +3874,7 @@ class BrainApiHttpService extends BaseHttpService {
3771
3874
  this.baseUrl = isDevMode() ? BRAIN_API_PREFIX : config?.['links']['brain_api'] ?? '';
3772
3875
  });
3773
3876
  }
3774
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainApiHttpService, deps: [{ token: i1$1.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
3877
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainApiHttpService, deps: [{ token: i1$2.HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
3775
3878
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainApiHttpService, providedIn: 'root' }); }
3776
3879
  }
3777
3880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: BrainApiHttpService, decorators: [{
@@ -3779,7 +3882,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3779
3882
  args: [{
3780
3883
  providedIn: 'root'
3781
3884
  }]
3782
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i0.Injector }] });
3885
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i0.Injector }] });
3783
3886
 
3784
3887
  class BrainApiService {
3785
3888
  constructor(api) {
@@ -3806,5 +3909,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
3806
3909
  * Generated bundle index. Do not edit.
3807
3910
  */
3808
3911
 
3809
- export { AbTestService, AhoyService, AuthService, BaseHttpService, BrainApiHttpService, BrainApiService, CommonService, CommonServicesModule, CustomPreloadingStrategy, CustomToastService, DashboardService, DataService, FeatureFlagService, FormHelperService, GeoService, GoogleAnalyticsService, GroupService, HopscotchService, IntegrationsApiHttpService, LinkService, LocalStorage, LogoCacheService, MCPOrchestratorService, MailBoxService, MainApiHttpService, McpJsonRpcService, NgbDateCustomParserFormatter, NotificationService, NumberPickerService, PermissionService, PrimeNgHelper, ProductService, ProfileService, QualificationService, ScriptLoaderService, SecureTokenStorageService, SentryErrorHandler, SeoService, SubscriptionService, TagService, TipsService, UserEffects, UserService, ValidationService, WebsocketService, WindowService };
3912
+ export { AbTestService, AhoyService, AuthService, BaseHttpService, BrainApiHttpService, BrainApiService, BrainSocketService, CommonService, CommonServicesModule, CustomPreloadingStrategy, CustomToastService, DashboardService, DataService, FeatureFlagService, FormHelperService, GeoService, GoogleAnalyticsService, GroupService, HopscotchService, IntegrationsApiHttpService, LinkService, LocalStorage, LogoCacheService, MCPOrchestratorService, MailBoxService, MainApiHttpService, McpJsonRpcService, NgbDateCustomParserFormatter, NotificationService, NumberPickerService, PermissionService, PrimeNgHelper, ProductService, ProfileService, QualificationService, ScriptLoaderService, SecureTokenStorageService, SentryErrorHandler, SeoService, SubscriptionService, TagService, TipsService, UserEffects, UserService, ValidationService, WebsocketService, WindowService };
3810
3913
  //# sourceMappingURL=posiwise-common-services.mjs.map