woodsportal-client-sdk 4.0.7-dev.3 → 4.0.7-dev.5

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 (56) hide show
  1. package/dist/adapters/angular/index.js +6 -6
  2. package/dist/adapters/react/index.js +6 -6
  3. package/dist/adapters/vue/index.js +6 -6
  4. package/dist/auth-interceptor-policy-GISRLYS5.js +5 -0
  5. package/dist/{auth-interceptor-policy-LU2L5NJM.js.map → auth-interceptor-policy-GISRLYS5.js.map} +1 -1
  6. package/dist/auth-utils-DM4YHWIH.js +5 -0
  7. package/dist/{auth-utils-Z5P6SMLJ.js.map → auth-utils-DM4YHWIH.js.map} +1 -1
  8. package/dist/{chunk-PPZCZJMI.js → chunk-2EFT76XX.js} +9 -9
  9. package/dist/chunk-2EFT76XX.js.map +1 -0
  10. package/dist/{chunk-4DP7JV7Q.js → chunk-2SZ2WQGG.js} +40 -8
  11. package/dist/chunk-2SZ2WQGG.js.map +1 -0
  12. package/dist/{chunk-SWXOID4X.js → chunk-6IGCVIVV.js} +23 -6
  13. package/dist/chunk-6IGCVIVV.js.map +1 -0
  14. package/dist/{chunk-BKT4MFQM.js → chunk-7JHBCIR5.js} +13 -5
  15. package/dist/chunk-7JHBCIR5.js.map +1 -0
  16. package/dist/{chunk-GUYIJ4ZE.js → chunk-AHRT7SME.js} +3 -3
  17. package/dist/{chunk-GUYIJ4ZE.js.map → chunk-AHRT7SME.js.map} +1 -1
  18. package/dist/{chunk-EFX2ISVS.js → chunk-AL3JKMCX.js} +3 -3
  19. package/dist/{chunk-EFX2ISVS.js.map → chunk-AL3JKMCX.js.map} +1 -1
  20. package/dist/{chunk-YOSZWNJA.js → chunk-CJZF3RTE.js} +7 -7
  21. package/dist/{chunk-YOSZWNJA.js.map → chunk-CJZF3RTE.js.map} +1 -1
  22. package/dist/{chunk-ZGA6KXES.js → chunk-FZYOTYDA.js} +103 -9
  23. package/dist/chunk-FZYOTYDA.js.map +1 -0
  24. package/dist/{chunk-B2OVKOJU.js → chunk-KYZRYIB3.js} +6 -6
  25. package/dist/{chunk-B2OVKOJU.js.map → chunk-KYZRYIB3.js.map} +1 -1
  26. package/dist/{chunk-FWXC23QP.js → chunk-WDCNNYEH.js} +4 -4
  27. package/dist/{chunk-FWXC23QP.js.map → chunk-WDCNNYEH.js.map} +1 -1
  28. package/dist/{chunk-YNOZWRK3.js → chunk-XANZNL46.js} +3 -3
  29. package/dist/{chunk-YNOZWRK3.js.map → chunk-XANZNL46.js.map} +1 -1
  30. package/dist/cross-tab-session-NJCGCGJM.js +9 -0
  31. package/dist/{cross-tab-session-HYXWGZSD.js.map → cross-tab-session-NJCGCGJM.js.map} +1 -1
  32. package/dist/entries/auth.d.ts +3 -2
  33. package/dist/entries/auth.js +8 -8
  34. package/dist/entries/auth.js.map +1 -1
  35. package/dist/entries/crm.d.ts +2 -2
  36. package/dist/entries/crm.js +9 -7
  37. package/dist/entries/crm.js.map +1 -1
  38. package/dist/{http-errors-Bwhj6cfB.d.ts → http-errors-OKY0E5C5.d.ts} +18 -2
  39. package/dist/index.d.ts +13 -4
  40. package/dist/index.js +15 -13
  41. package/dist/index.js.map +1 -1
  42. package/dist/{cache-purge-CZQIOofb.d.ts → pipeline-ui-DbEzI_v1.d.ts} +11 -1
  43. package/dist/{refresh-lock-JQVP4YOS.js → refresh-lock-H6P2SXGP.js} +3 -3
  44. package/dist/{refresh-lock-JQVP4YOS.js.map → refresh-lock-H6P2SXGP.js.map} +1 -1
  45. package/dist/storage-migration-TFF6IQTD.js +4 -0
  46. package/dist/{storage-migration-BY2QL6YD.js.map → storage-migration-TFF6IQTD.js.map} +1 -1
  47. package/package.json +1 -1
  48. package/dist/auth-interceptor-policy-LU2L5NJM.js +0 -5
  49. package/dist/auth-utils-Z5P6SMLJ.js +0 -5
  50. package/dist/chunk-4DP7JV7Q.js.map +0 -1
  51. package/dist/chunk-BKT4MFQM.js.map +0 -1
  52. package/dist/chunk-PPZCZJMI.js.map +0 -1
  53. package/dist/chunk-SWXOID4X.js.map +0 -1
  54. package/dist/chunk-ZGA6KXES.js.map +0 -1
  55. package/dist/cross-tab-session-HYXWGZSD.js +0 -9
  56. package/dist/storage-migration-BY2QL6YD.js +0 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main/core/utils/wp-storage-keys.ts"],"names":[],"mappings":"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","file":"chunk-7JHBCIR5.js","sourcesContent":["/**\n * Canonical WoodsPortal browser storage key names (`wp.{lane}.{domain}.{name}`).\n * Import from here — do not scatter string literals in app code.\n */\n\nexport const WP_UI_THEME = 'wp.ui.theme'\n\nexport const WP_STORAGE_KEYS = {\n c: {\n hub: 'wp.c.hub',\n auth: {\n login: 'wp.c.auth.login',\n refresh: 'wp.c.auth.refresh',\n portal: 'wp.c.auth.portal',\n sub: 'wp.c.auth.sub',\n emailOk: 'wp.c.auth.emailOk',\n err: 'wp.c.auth.err',\n refreshExhausted: 'wp.c.auth.refreshExhausted',\n rev: 'wp.c.auth.rev',\n refreshLock: 'wp.c.auth.refreshLock',\n iframeRtPrefix: 'wp.c.auth.rt.'\n },\n ui: {\n pag: 'wp.c.ui.pag',\n menu: 'wp.c.ui.menu',\n assoc: 'wp.c.ui.assoc'\n },\n login: {\n email: 'wp.c.login.email',\n force: 'wp.c.login.force',\n passkey: 'wp.c.login.passkey',\n done: 'wp.c.login.done',\n outcome: 'wp.c.login.outcome',\n registerPayload: 'wp.c.login.registerPayload'\n },\n mfa: {\n methods: 'wp.c.mfa.methods',\n default: 'wp.c.mfa.default',\n otp: 'wp.c.mfa.otp',\n scope: 'wp.c.mfa.scope',\n portalId: 'wp.c.mfa.portalId',\n portalName: 'wp.c.mfa.portalName',\n portalUrl: 'wp.c.mfa.portalUrl',\n enrolled: 'wp.c.mfa.enrolled',\n emailOk: 'wp.c.mfa.emailOk',\n phoneOk: 'wp.c.mfa.phoneOk',\n pendingToken: 'wp.c.mfa.pendingToken',\n pendingTokenExp: 'wp.c.mfa.pendingTokenExp',\n otpSend: 'wp.c.mfa.otpSend'\n },\n sso: {\n cb: 'wp.c.sso.cb'\n }\n },\n a: {\n auth: {\n login: 'wp.a.auth.login',\n emailOk: 'wp.a.auth.emailOk',\n mfa: 'wp.a.auth.mfa',\n portalId: 'wp.a.auth.portalId',\n portal: 'wp.a.auth.portal',\n accT: 'wp.a.auth.accT',\n sesT: 'wp.a.auth.sesT',\n err: 'wp.a.auth.err',\n noBoot: 'wp.a.auth.noBoot',\n refreshLock: 'wp.a.auth.refreshLock',\n rev: 'wp.a.auth.rev'\n },\n hub: {\n id: 'wp.a.hub.id',\n acct: 'wp.a.hub.acct',\n cfg: 'wp.a.hub.cfg'\n },\n sync: {\n create: 'wp.a.sync.create',\n state: 'wp.a.sync.state',\n jobId: 'wp.a.sync.jobId',\n jobType: 'wp.a.sync.jobType'\n },\n ui: {\n loading: 'wp.a.ui.loading',\n intTabPrefix: 'wp.a.ui.intTab.'\n },\n mfa: {\n methods: 'wp.a.mfa.methods',\n default: 'wp.a.mfa.default',\n otp: 'wp.a.mfa.otp',\n scope: 'wp.a.mfa.scope',\n portalId: 'wp.a.mfa.portalId',\n portalName: 'wp.a.mfa.portalName',\n portalUrl: 'wp.a.mfa.portalUrl',\n enrolled: 'wp.a.mfa.enrolled',\n emailOk: 'wp.a.mfa.emailOk',\n phoneOk: 'wp.a.mfa.phoneOk',\n pendingToken: 'wp.a.mfa.pendingToken',\n pendingTokenExp: 'wp.a.mfa.pendingTokenExp',\n otpSend: 'wp.a.mfa.otpSend'\n },\n sso: {\n cbPrefix: 'wp.a.sso.cb.'\n },\n bill: {\n result: 'wp.a.bill.result'\n }\n },\n d: {\n log: 'wp.d.log',\n cfg: {\n theme: 'wp.d.cfg.theme',\n side: 'wp.d.cfg.side'\n }\n }\n} as const\n\n/** Dynamic iframe refresh localStorage key for a hub. */\nexport function wpClientIframeRefreshKey(hubId: string | number): string {\n return `${WP_STORAGE_KEYS.c.auth.iframeRtPrefix}${hubId}`\n}\n\nexport function wpClientIframeRefreshExpKey(hubId: string | number): string {\n return `${wpClientIframeRefreshKey(hubId)}.exp`\n}\n\nexport function wpAdminIntegrationTabKey(hubId: string | number, portalId: string | number): string {\n return `${WP_STORAGE_KEYS.a.ui.intTabPrefix}${hubId}.${portalId}`\n}\n\nexport function wpAdminSsoCallbackKey(code: string, state: string): string {\n return `${WP_STORAGE_KEYS.a.sso.cbPrefix}${code}.${state}`\n}\n\n/** Legacy client cookie names cleared during logout (two release cycles). */\nexport const LEGACY_CLIENT_AUTH_COOKIES = [\n 'woodsportal_login',\n 'woodsportal_user',\n 'woodsportal_refresh',\n 'woodsportal_portal',\n 'woodsportal_subscription',\n 'woodsportal_pagination',\n 'woodsportal_route_menu',\n 'woodsportal_association_view',\n 'woodsportal_access_token',\n 'IS_EMAIL_VERIFY',\n 'loginDetails',\n 'refreshToken',\n 'portal',\n 'subscriptionType'\n] as const\n\n/** Legacy client localStorage keys. */\nexport const LEGACY_CLIENT_LOCAL_KEYS = ['hubSpotData', 'theme', 'wp_iframe_rt_'] as const\n\n/** Legacy client sessionStorage key prefixes / exact names. */\nexport const LEGACY_CLIENT_SESSION_EXACT = ['authError', 'sso_callback_processed', 'entredEmail'] as const\n\nexport const LEGACY_CLIENT_SESSION_PREFIXES = ['woodsportal.login.', 'woodsportal.mfa.'] as const\n\n/** Pairs of [legacy, canonical] for exact sessionStorage keys. */\nexport const CLIENT_SESSION_STORAGE_MIGRATIONS: ReadonlyArray<readonly [string, string]> = [\n ['woodsportal.login.email', WP_STORAGE_KEYS.c.login.email],\n ['woodsportal.login.forcePreLogin', WP_STORAGE_KEYS.c.login.force],\n ['woodsportal.login.passkeyPrimaryEnrolled', WP_STORAGE_KEYS.c.login.passkey],\n ['woodsportal.login.preLoginCompletedKey', WP_STORAGE_KEYS.c.login.done],\n ['authError', WP_STORAGE_KEYS.c.auth.err],\n ['sso_callback_processed', WP_STORAGE_KEYS.c.sso.cb],\n ['woodsportal.mfa.methods', WP_STORAGE_KEYS.c.mfa.methods],\n ['woodsportal.mfa.defaultMethod', WP_STORAGE_KEYS.c.mfa.default],\n ['woodsportal.mfa.otpDelivery', WP_STORAGE_KEYS.c.mfa.otp],\n ['woodsportal.mfa.otpDestinationMasked', WP_STORAGE_KEYS.c.mfa.otp],\n ['woodsportal.mfa.scopeKey', WP_STORAGE_KEYS.c.mfa.scope],\n ['woodsportal.mfa.portalId', WP_STORAGE_KEYS.c.mfa.portalId],\n ['woodsportal.mfa.portalName', WP_STORAGE_KEYS.c.mfa.portalName],\n ['woodsportal.mfa.portalUrl', WP_STORAGE_KEYS.c.mfa.portalUrl],\n ['woodsportal.mfa.enrolledForThisPortal', WP_STORAGE_KEYS.c.mfa.enrolled],\n ['woodsportal.mfa.emailVerifiedForThisPortal', WP_STORAGE_KEYS.c.mfa.emailOk],\n ['woodsportal.mfa.phoneVerifiedForThisPortal', WP_STORAGE_KEYS.c.mfa.phoneOk]\n]\n\n/** Cookie migration pairs [legacy, canonical]. */\nexport const CLIENT_COOKIE_MIGRATIONS: ReadonlyArray<readonly [string, string]> = [\n ['woodsportal_login', WP_STORAGE_KEYS.c.auth.login],\n ['loginDetails', WP_STORAGE_KEYS.c.auth.login],\n ['woodsportal_user', WP_STORAGE_KEYS.c.auth.login],\n ['woodsportal_refresh', WP_STORAGE_KEYS.c.auth.refresh],\n ['refreshToken', WP_STORAGE_KEYS.c.auth.refresh],\n ['woodsportal_portal', WP_STORAGE_KEYS.c.auth.portal],\n ['portal', WP_STORAGE_KEYS.c.auth.portal],\n ['woodsportal_subscription', WP_STORAGE_KEYS.c.auth.sub],\n ['subscriptionType', WP_STORAGE_KEYS.c.auth.sub],\n ['woodsportal_pagination', WP_STORAGE_KEYS.c.ui.pag],\n ['woodsportal_route_menu', WP_STORAGE_KEYS.c.ui.menu],\n ['woodsportal_association_view', WP_STORAGE_KEYS.c.ui.assoc],\n ['IS_EMAIL_VERIFY', WP_STORAGE_KEYS.c.auth.emailOk]\n]\n"]}
@@ -1,5 +1,5 @@
1
1
  import { AuthErrorCode } from './chunk-COHBSTHF.js';
2
- import { WP_STORAGE_KEYS } from './chunk-BKT4MFQM.js';
2
+ import { WP_STORAGE_KEYS } from './chunk-7JHBCIR5.js';
3
3
 
4
4
  // src/main/core/auth/auth-interceptor-policy.ts
5
5
  var DEFAULT_SESSION_PROBE_SUFFIXES = ["/auth/me"];
@@ -161,5 +161,5 @@ function resolveAuthErrorAction(input) {
161
161
  }
162
162
 
163
163
  export { isOptionalAuthFailureUrl, isRefreshEndpointUrl, isSessionProbeUrl, persistAuthError, readPersistedAuthError, resolveAuthErrorAction };
164
- //# sourceMappingURL=chunk-GUYIJ4ZE.js.map
165
- //# sourceMappingURL=chunk-GUYIJ4ZE.js.map
164
+ //# sourceMappingURL=chunk-AHRT7SME.js.map
165
+ //# sourceMappingURL=chunk-AHRT7SME.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main/core/auth/auth-interceptor-policy.ts"],"names":[],"mappings":"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","file":"chunk-GUYIJ4ZE.js","sourcesContent":["import { AuthErrorCode, type ApiErrorPayload } from './auth-error-codes.js'\nimport { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\n\nexport type WoodsportalRequestConfig = {\n __isRetryRequest?: boolean\n skipGlobalAuthRedirect?: boolean\n url?: string\n}\n\nexport type AuthErrorAction =\n | { kind: 'refresh_retry' }\n | { kind: 'reject' }\n | { kind: 'redirect'; route: string; clearSession: boolean }\n | { kind: 'logout'; route: string; clearSession: boolean }\n\n/** Lane-specific routes for auth error redirects (hash or path prefixes supplied by each app). */\nexport type AuthPolicyRoutes = {\n unauthorized: string\n login: string\n twoFa: string\n resendEmail: string\n accountSelect: string\n}\n\nexport type AuthInterceptorPolicyConfig = {\n routes: AuthPolicyRoutes\n /** Request paths that must not trigger global logout (e.g. MFA enrollment). */\n optionalAuthFailurePaths?: string[]\n /** Paths treated as session probes (401/403 → unauthorized page). */\n sessionProbePaths?: string[]\n /** When true, optional MFA/security path prefixes match. */\n includeAdminMfaSecurityPrefixes?: boolean\n}\n\nconst DEFAULT_SESSION_PROBE_SUFFIXES = ['/auth/me']\n\nconst REFRESH_ENDPOINT_SUFFIXES = ['/auth/refresh', '/auth/refresh-cookie'] as const\n\n/** True when the failed request is a token refresh call (must not trigger nested refresh_retry). */\nexport function isRefreshEndpointUrl(url: string | undefined): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n return REFRESH_ENDPOINT_SUFFIXES.some((suffix) => path.endsWith(suffix))\n}\n\nfunction normalizeRequestUrl(url?: string): string {\n if (!url) return ''\n try {\n if (url.startsWith('http')) {\n return new URL(url).pathname\n }\n } catch {\n // fall through\n }\n return url.split('?')[0] ?? url\n}\n\nexport function isOptionalAuthFailureUrl(url: string | undefined, config: AuthInterceptorPolicyConfig): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n\n if (config.optionalAuthFailurePaths?.includes(path)) {\n return true\n }\n\n if (config.includeAdminMfaSecurityPrefixes) {\n if (path.includes('/api/admin/auth/security/')) return true\n if (path.includes('/api/admin/auth/mfa/webauthn/')) return true\n if (path.includes('/api/auth/security/')) return true\n if (path.includes('/api/auth/mfa/webauthn/')) return true\n }\n\n return false\n}\n\nexport function isSessionProbeUrl(url: string | undefined, config: AuthInterceptorPolicyConfig): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n if (config.sessionProbePaths?.includes(path)) return true\n return DEFAULT_SESSION_PROBE_SUFFIXES.some((suffix) => path.endsWith(suffix))\n}\n\nexport function persistAuthError(payload: ApiErrorPayload): ApiErrorPayload & { ts: number } {\n const data = {\n ...payload,\n ts: Date.now()\n }\n if (typeof window !== 'undefined' && window.sessionStorage) {\n sessionStorage.setItem(WP_STORAGE_KEYS.c.auth.err, JSON.stringify(data))\n sessionStorage.removeItem('authError')\n }\n return data\n}\n\n/** Read persisted auth error (canonical key with legacy fallback). */\nexport function readPersistedAuthError(): (ApiErrorPayload & { ts: number }) | null {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return null\n }\n const raw = window.sessionStorage.getItem(WP_STORAGE_KEYS.c.auth.err) ?? window.sessionStorage.getItem('authError')\n if (!raw) {\n return null\n }\n try {\n return JSON.parse(raw) as ApiErrorPayload & { ts: number }\n } catch {\n return null\n }\n}\n\nfunction logoutAction(errorCode: string | undefined, routes: AuthPolicyRoutes): AuthErrorAction {\n if (errorCode === AuthErrorCode.HUBSPOT_REAUTH_REQUIRED) {\n return {\n kind: 'redirect',\n route: routes.accountSelect,\n clearSession: false\n }\n }\n return {\n kind: 'logout',\n route: routes.unauthorized,\n clearSession: true\n }\n}\n\nfunction resolveByErrorCode(\n errorCode: string | undefined,\n status: number,\n url: string,\n isRetryRequest: boolean | undefined,\n policy: AuthInterceptorPolicyConfig\n): AuthErrorAction {\n const { routes } = policy\n\n switch (errorCode) {\n case AuthErrorCode.TOKEN_EXPIRED:\n case AuthErrorCode.TOKEN_INVALID:\n case AuthErrorCode.AUTHENTICATION_FAILED:\n return isRetryRequest ? logoutAction(errorCode, routes) : { kind: 'refresh_retry' }\n\n case AuthErrorCode.MISSING_REFRESH_TOKEN:\n case AuthErrorCode.ACCESS_UNAUTHORIZED:\n return logoutAction(errorCode, routes)\n\n case AuthErrorCode.ACCOUNT_LOCKED:\n case AuthErrorCode.ACCOUNT_DISABLED:\n return {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: true\n }\n\n case AuthErrorCode.LOGIN_FAILED:\n case AuthErrorCode.INVALID_CREDENTIALS:\n return { kind: 'reject' }\n\n case AuthErrorCode.EMAIL_NOT_VERIFIED:\n return {\n kind: 'redirect',\n route: routes.resendEmail,\n clearSession: false\n }\n\n case AuthErrorCode.TWO_FACTOR_REQUIRED:\n return {\n kind: 'redirect',\n route: routes.twoFa,\n clearSession: false\n }\n\n case AuthErrorCode.HUBSPOT_REAUTH_REQUIRED:\n return {\n kind: 'redirect',\n route: routes.accountSelect,\n clearSession: false\n }\n\n case AuthErrorCode.OAUTH_PROCESSING_ERROR:\n case AuthErrorCode.PORTAL_INACTIVE:\n case AuthErrorCode.AMBIGUOUS_HUB_ID:\n case AuthErrorCode.MISSING_HEADERS:\n case AuthErrorCode.COMMERCIAL_ACCESS_EXPIRED:\n return { kind: 'reject' }\n\n case AuthErrorCode.ACCESS_DENIED:\n case AuthErrorCode.ACCESS_FORBIDDEN:\n if (isSessionProbeUrl(url, policy)) {\n return {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: false\n }\n }\n return { kind: 'reject' }\n\n default:\n if (status === 401) {\n return isRetryRequest ? logoutAction(errorCode, routes) : { kind: 'refresh_retry' }\n }\n if (status === 403) {\n return isSessionProbeUrl(url, policy)\n ? {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: false\n }\n : { kind: 'reject' }\n }\n return { kind: 'reject' }\n }\n}\n\nexport function resolveAuthErrorAction(input: {\n status: number\n errorCode?: string\n url?: string\n skipGlobalAuthRedirect?: boolean\n isRetryRequest?: boolean\n policy: AuthInterceptorPolicyConfig\n}): AuthErrorAction {\n const { status, errorCode, url, skipGlobalAuthRedirect, isRetryRequest, policy } = input\n\n if (status !== 401 && status !== 403) {\n return { kind: 'reject' }\n }\n\n if (skipGlobalAuthRedirect || isOptionalAuthFailureUrl(url, policy)) {\n return { kind: 'reject' }\n }\n\n if (isRefreshEndpointUrl(url)) {\n return { kind: 'reject' }\n }\n\n return resolveByErrorCode(errorCode, status, url ?? '', isRetryRequest, policy)\n}\n"]}
1
+ {"version":3,"sources":["../src/main/core/auth/auth-interceptor-policy.ts"],"names":[],"mappings":"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","file":"chunk-AHRT7SME.js","sourcesContent":["import { AuthErrorCode, type ApiErrorPayload } from './auth-error-codes.js'\nimport { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\n\nexport type WoodsportalRequestConfig = {\n __isRetryRequest?: boolean\n skipGlobalAuthRedirect?: boolean\n url?: string\n}\n\nexport type AuthErrorAction =\n | { kind: 'refresh_retry' }\n | { kind: 'reject' }\n | { kind: 'redirect'; route: string; clearSession: boolean }\n | { kind: 'logout'; route: string; clearSession: boolean }\n\n/** Lane-specific routes for auth error redirects (hash or path prefixes supplied by each app). */\nexport type AuthPolicyRoutes = {\n unauthorized: string\n login: string\n twoFa: string\n resendEmail: string\n accountSelect: string\n}\n\nexport type AuthInterceptorPolicyConfig = {\n routes: AuthPolicyRoutes\n /** Request paths that must not trigger global logout (e.g. MFA enrollment). */\n optionalAuthFailurePaths?: string[]\n /** Paths treated as session probes (401/403 → unauthorized page). */\n sessionProbePaths?: string[]\n /** When true, optional MFA/security path prefixes match. */\n includeAdminMfaSecurityPrefixes?: boolean\n}\n\nconst DEFAULT_SESSION_PROBE_SUFFIXES = ['/auth/me']\n\nconst REFRESH_ENDPOINT_SUFFIXES = ['/auth/refresh', '/auth/refresh-cookie'] as const\n\n/** True when the failed request is a token refresh call (must not trigger nested refresh_retry). */\nexport function isRefreshEndpointUrl(url: string | undefined): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n return REFRESH_ENDPOINT_SUFFIXES.some((suffix) => path.endsWith(suffix))\n}\n\nfunction normalizeRequestUrl(url?: string): string {\n if (!url) return ''\n try {\n if (url.startsWith('http')) {\n return new URL(url).pathname\n }\n } catch {\n // fall through\n }\n return url.split('?')[0] ?? url\n}\n\nexport function isOptionalAuthFailureUrl(url: string | undefined, config: AuthInterceptorPolicyConfig): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n\n if (config.optionalAuthFailurePaths?.includes(path)) {\n return true\n }\n\n if (config.includeAdminMfaSecurityPrefixes) {\n if (path.includes('/api/admin/auth/security/')) return true\n if (path.includes('/api/admin/auth/mfa/webauthn/')) return true\n if (path.includes('/api/auth/security/')) return true\n if (path.includes('/api/auth/mfa/webauthn/')) return true\n }\n\n return false\n}\n\nexport function isSessionProbeUrl(url: string | undefined, config: AuthInterceptorPolicyConfig): boolean {\n const path = normalizeRequestUrl(url)\n if (!path) return false\n if (config.sessionProbePaths?.includes(path)) return true\n return DEFAULT_SESSION_PROBE_SUFFIXES.some((suffix) => path.endsWith(suffix))\n}\n\nexport function persistAuthError(payload: ApiErrorPayload): ApiErrorPayload & { ts: number } {\n const data = {\n ...payload,\n ts: Date.now()\n }\n if (typeof window !== 'undefined' && window.sessionStorage) {\n sessionStorage.setItem(WP_STORAGE_KEYS.c.auth.err, JSON.stringify(data))\n sessionStorage.removeItem('authError')\n }\n return data\n}\n\n/** Read persisted auth error (canonical key with legacy fallback). */\nexport function readPersistedAuthError(): (ApiErrorPayload & { ts: number }) | null {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return null\n }\n const raw = window.sessionStorage.getItem(WP_STORAGE_KEYS.c.auth.err) ?? window.sessionStorage.getItem('authError')\n if (!raw) {\n return null\n }\n try {\n return JSON.parse(raw) as ApiErrorPayload & { ts: number }\n } catch {\n return null\n }\n}\n\nfunction logoutAction(errorCode: string | undefined, routes: AuthPolicyRoutes): AuthErrorAction {\n if (errorCode === AuthErrorCode.HUBSPOT_REAUTH_REQUIRED) {\n return {\n kind: 'redirect',\n route: routes.accountSelect,\n clearSession: false\n }\n }\n return {\n kind: 'logout',\n route: routes.unauthorized,\n clearSession: true\n }\n}\n\nfunction resolveByErrorCode(\n errorCode: string | undefined,\n status: number,\n url: string,\n isRetryRequest: boolean | undefined,\n policy: AuthInterceptorPolicyConfig\n): AuthErrorAction {\n const { routes } = policy\n\n switch (errorCode) {\n case AuthErrorCode.TOKEN_EXPIRED:\n case AuthErrorCode.TOKEN_INVALID:\n case AuthErrorCode.AUTHENTICATION_FAILED:\n return isRetryRequest ? logoutAction(errorCode, routes) : { kind: 'refresh_retry' }\n\n case AuthErrorCode.MISSING_REFRESH_TOKEN:\n case AuthErrorCode.ACCESS_UNAUTHORIZED:\n return logoutAction(errorCode, routes)\n\n case AuthErrorCode.ACCOUNT_LOCKED:\n case AuthErrorCode.ACCOUNT_DISABLED:\n return {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: true\n }\n\n case AuthErrorCode.LOGIN_FAILED:\n case AuthErrorCode.INVALID_CREDENTIALS:\n return { kind: 'reject' }\n\n case AuthErrorCode.EMAIL_NOT_VERIFIED:\n return {\n kind: 'redirect',\n route: routes.resendEmail,\n clearSession: false\n }\n\n case AuthErrorCode.TWO_FACTOR_REQUIRED:\n return {\n kind: 'redirect',\n route: routes.twoFa,\n clearSession: false\n }\n\n case AuthErrorCode.HUBSPOT_REAUTH_REQUIRED:\n return {\n kind: 'redirect',\n route: routes.accountSelect,\n clearSession: false\n }\n\n case AuthErrorCode.OAUTH_PROCESSING_ERROR:\n case AuthErrorCode.PORTAL_INACTIVE:\n case AuthErrorCode.AMBIGUOUS_HUB_ID:\n case AuthErrorCode.MISSING_HEADERS:\n case AuthErrorCode.COMMERCIAL_ACCESS_EXPIRED:\n return { kind: 'reject' }\n\n case AuthErrorCode.ACCESS_DENIED:\n case AuthErrorCode.ACCESS_FORBIDDEN:\n if (isSessionProbeUrl(url, policy)) {\n return {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: false\n }\n }\n return { kind: 'reject' }\n\n default:\n if (status === 401) {\n return isRetryRequest ? logoutAction(errorCode, routes) : { kind: 'refresh_retry' }\n }\n if (status === 403) {\n return isSessionProbeUrl(url, policy)\n ? {\n kind: 'redirect',\n route: routes.unauthorized,\n clearSession: false\n }\n : { kind: 'reject' }\n }\n return { kind: 'reject' }\n }\n}\n\nexport function resolveAuthErrorAction(input: {\n status: number\n errorCode?: string\n url?: string\n skipGlobalAuthRedirect?: boolean\n isRetryRequest?: boolean\n policy: AuthInterceptorPolicyConfig\n}): AuthErrorAction {\n const { status, errorCode, url, skipGlobalAuthRedirect, isRetryRequest, policy } = input\n\n if (status !== 401 && status !== 403) {\n return { kind: 'reject' }\n }\n\n if (skipGlobalAuthRedirect || isOptionalAuthFailureUrl(url, policy)) {\n return { kind: 'reject' }\n }\n\n if (isRefreshEndpointUrl(url)) {\n return { kind: 'reject' }\n }\n\n return resolveByErrorCode(errorCode, status, url ?? '', isRetryRequest, policy)\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { createStore } from './chunk-4DP7JV7Q.js';
1
+ import { createStore } from './chunk-2SZ2WQGG.js';
2
2
 
3
3
  // src/main/state/crm/use-multi-object.ts
4
4
  var multiObjectStore = createStore({
@@ -91,5 +91,5 @@ var actions = {
91
91
  };
92
92
 
93
93
  export { actions, multiObjectStore };
94
- //# sourceMappingURL=chunk-EFX2ISVS.js.map
95
- //# sourceMappingURL=chunk-EFX2ISVS.js.map
94
+ //# sourceMappingURL=chunk-AL3JKMCX.js.map
95
+ //# sourceMappingURL=chunk-AL3JKMCX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main/state/crm/use-multi-object.ts"],"names":[],"mappings":"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","file":"chunk-EFX2ISVS.js","sourcesContent":["import { createStore } from './store'\n\nexport interface MultiObjectTableState {\n objects: Record<string, any>\n objectsPrependData: Record<string, any[]>\n meta: Record<string, { selectedPipeline: string; viewType: string }>\n}\n\nexport const multiObjectStore = createStore<MultiObjectTableState>({\n objects: {},\n objectsPrependData: {},\n meta: {}\n})\n\nfunction getObjectKey(payload: any): string {\n return String(payload?.hubspotObjectTypeId ?? '')\n}\n\nexport const actions = {\n setMultiObjectData(response: any, payload: any) {\n const key = getObjectKey(payload)\n const state = multiObjectStore.getState()\n\n const rows = response?.data?.results?.rows ?? []\n const rowIds = new Set(\n rows\n .map((row: any) => row.id ?? row.hs_object_id)\n .filter((id: unknown) => id != null && id !== '')\n .map((id: unknown) => String(id))\n )\n\n let newPrependForKey = (state.objectsPrependData[key] ?? []).filter((item: any) => {\n const itemId = item.id ?? item.hs_object_id\n if (itemId == null || itemId === '') return true\n return !rowIds.has(String(itemId))\n })\n\n const selectedPipeline = payload?.selectedPipeline ?? ''\n const viewType = response?.info?.viewType ?? ''\n const prevMeta = state.meta[key]\n\n if (response?.data?.total < 1 || payload?.componentName) {\n newPrependForKey = []\n }\n\n if (prevMeta?.viewType && prevMeta.viewType !== viewType) {\n newPrependForKey = []\n }\n\n if (prevMeta?.selectedPipeline && prevMeta.selectedPipeline !== selectedPipeline) {\n newPrependForKey = []\n }\n\n multiObjectStore.setState({\n objects: { ...state.objects, [key]: response },\n objectsPrependData: { ...state.objectsPrependData, [key]: newPrependForKey },\n meta: {\n ...state.meta,\n [key]: { selectedPipeline, viewType }\n }\n })\n },\n\n clearMultiObjectPrependData(hubspotObjectTypeId?: string) {\n const state = multiObjectStore.getState()\n\n if (!hubspotObjectTypeId) {\n multiObjectStore.setState({ objectsPrependData: {} })\n return\n }\n\n const key = String(hubspotObjectTypeId)\n const { [key]: _, ...rest } = state.objectsPrependData\n multiObjectStore.setState({ objectsPrependData: rest })\n },\n\n async setMultiObjectPrependData(response: any, props?: any) {\n const key = getObjectKey(props)\n const state = multiObjectStore.getState()\n const tableResponse = state.objects[key]\n let rows: any[] = state.objectsPrependData[key] ?? []\n\n if (tableResponse?.data?.total > 1) {\n if (response === 'loading') {\n const row = tableResponse?.data?.results?.columns.reduce((acc: any, item: any) => {\n if (!item.hidden) {\n acc[item.key] = 'loading'\n }\n return acc\n }, {})\n rows = [row, ...rows]\n } else if (response?.data) {\n const data = response?.data\n if (!data) {\n multiObjectStore.setState({\n objectsPrependData: { ...state.objectsPrependData, [key]: [] }\n })\n return\n }\n\n const row = Object.fromEntries(Object.entries(data).map(([k, value]: any) => [k, value?.value ?? value]))\n\n rows = [...rows]\n if (rows.length > 0) {\n rows[0] = row\n } else {\n rows.push(row)\n }\n }\n }\n\n multiObjectStore.setState({\n objectsPrependData: { ...state.objectsPrependData, [key]: rows }\n })\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/main/state/crm/use-multi-object.ts"],"names":[],"mappings":"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","file":"chunk-AL3JKMCX.js","sourcesContent":["import { createStore } from './store'\n\nexport interface MultiObjectTableState {\n objects: Record<string, any>\n objectsPrependData: Record<string, any[]>\n meta: Record<string, { selectedPipeline: string; viewType: string }>\n}\n\nexport const multiObjectStore = createStore<MultiObjectTableState>({\n objects: {},\n objectsPrependData: {},\n meta: {}\n})\n\nfunction getObjectKey(payload: any): string {\n return String(payload?.hubspotObjectTypeId ?? '')\n}\n\nexport const actions = {\n setMultiObjectData(response: any, payload: any) {\n const key = getObjectKey(payload)\n const state = multiObjectStore.getState()\n\n const rows = response?.data?.results?.rows ?? []\n const rowIds = new Set(\n rows\n .map((row: any) => row.id ?? row.hs_object_id)\n .filter((id: unknown) => id != null && id !== '')\n .map((id: unknown) => String(id))\n )\n\n let newPrependForKey = (state.objectsPrependData[key] ?? []).filter((item: any) => {\n const itemId = item.id ?? item.hs_object_id\n if (itemId == null || itemId === '') return true\n return !rowIds.has(String(itemId))\n })\n\n const selectedPipeline = payload?.selectedPipeline ?? ''\n const viewType = response?.info?.viewType ?? ''\n const prevMeta = state.meta[key]\n\n if (response?.data?.total < 1 || payload?.componentName) {\n newPrependForKey = []\n }\n\n if (prevMeta?.viewType && prevMeta.viewType !== viewType) {\n newPrependForKey = []\n }\n\n if (prevMeta?.selectedPipeline && prevMeta.selectedPipeline !== selectedPipeline) {\n newPrependForKey = []\n }\n\n multiObjectStore.setState({\n objects: { ...state.objects, [key]: response },\n objectsPrependData: { ...state.objectsPrependData, [key]: newPrependForKey },\n meta: {\n ...state.meta,\n [key]: { selectedPipeline, viewType }\n }\n })\n },\n\n clearMultiObjectPrependData(hubspotObjectTypeId?: string) {\n const state = multiObjectStore.getState()\n\n if (!hubspotObjectTypeId) {\n multiObjectStore.setState({ objectsPrependData: {} })\n return\n }\n\n const key = String(hubspotObjectTypeId)\n const { [key]: _, ...rest } = state.objectsPrependData\n multiObjectStore.setState({ objectsPrependData: rest })\n },\n\n async setMultiObjectPrependData(response: any, props?: any) {\n const key = getObjectKey(props)\n const state = multiObjectStore.getState()\n const tableResponse = state.objects[key]\n let rows: any[] = state.objectsPrependData[key] ?? []\n\n if (tableResponse?.data?.total > 1) {\n if (response === 'loading') {\n const row = tableResponse?.data?.results?.columns.reduce((acc: any, item: any) => {\n if (!item.hidden) {\n acc[item.key] = 'loading'\n }\n return acc\n }, {})\n rows = [row, ...rows]\n } else if (response?.data) {\n const data = response?.data\n if (!data) {\n multiObjectStore.setState({\n objectsPrependData: { ...state.objectsPrependData, [key]: [] }\n })\n return\n }\n\n const row = Object.fromEntries(Object.entries(data).map(([k, value]: any) => [k, value?.value ?? value]))\n\n rows = [...rows]\n if (rows.length > 0) {\n rows[0] = row\n } else {\n rows.push(row)\n }\n }\n }\n\n multiObjectStore.setState({\n objectsPrependData: { ...state.objectsPrependData, [key]: rows }\n })\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { multiObjectStore } from './chunk-EFX2ISVS.js';
2
- import { actions2, tableStore, tableUiStore, noteStore, emailStore, userStore, syncStore, formStore, fileStore } from './chunk-4DP7JV7Q.js';
3
- import { clearAccessToken, resetSessionAuthState, clearSessionRefreshExhaustedState } from './chunk-B2OVKOJU.js';
4
- import { clearClientAuthCookies, clearClientIframeRefreshLocalKeys } from './chunk-YNOZWRK3.js';
5
- import { WP_STORAGE_KEYS } from './chunk-BKT4MFQM.js';
1
+ import { multiObjectStore } from './chunk-AL3JKMCX.js';
2
+ import { actions2, tableStore, tableUiStore, noteStore, emailStore, userStore, syncStore, formStore, fileStore } from './chunk-2SZ2WQGG.js';
3
+ import { clearAccessToken, resetSessionAuthState, clearSessionRefreshExhaustedState } from './chunk-KYZRYIB3.js';
4
+ import { clearClientAuthCookies, clearClientIframeRefreshLocalKeys } from './chunk-XANZNL46.js';
5
+ import { WP_STORAGE_KEYS } from './chunk-7JHBCIR5.js';
6
6
 
7
7
  // src/main/core/http/session-teardown.ts
8
8
  function resetSessionStores() {
@@ -159,5 +159,5 @@ function resetCrossTabSessionSyncForTests() {
159
159
  }
160
160
 
161
161
  export { applyCrossTabSessionRevocation, clearClientSdkSession, installCrossTabSessionListener, resetCrossTabSessionSyncForTests, resetSessionStores, signalSessionChanged };
162
- //# sourceMappingURL=chunk-YOSZWNJA.js.map
163
- //# sourceMappingURL=chunk-YOSZWNJA.js.map
162
+ //# sourceMappingURL=chunk-CJZF3RTE.js.map
163
+ //# sourceMappingURL=chunk-CJZF3RTE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main/core/http/session-teardown.ts","../src/main/core/http/cross-tab-session.ts"],"names":["actions"],"mappings":"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","file":"chunk-YOSZWNJA.js","sourcesContent":["import { clearAccessToken, clearSessionRefreshExhaustedState, resetSessionAuthState } from './token-store'\nimport { clearClientAuthCookies } from '../utils/cookie'\nimport { clearClientIframeRefreshLocalKeys } from '../utils/storage-migration'\nimport {\n tableStore,\n tableActions,\n tableUiStore,\n noteStore,\n emailStore,\n userStore,\n syncStore,\n formStore,\n fileStore,\n multiObjectStore\n} from '../../state/index.js'\n\n/** Reset CRM nanostores to empty session state (logout / forced 401). */\nexport function resetSessionStores(): void {\n tableActions.clearTablePrependData()\n tableStore.setState({\n queryParams: null,\n multiObjectsQueryParams: {},\n objectsData: null,\n tableData: [],\n tablePrependData: [],\n hubspotObjectTypeId: '',\n selectedPipeline: '',\n viewType: ''\n })\n tableUiStore.setState({\n tableUniqueId: null,\n gridData: [],\n sort: '-hs_createdate',\n limit: 10,\n after: '',\n page: 1,\n nextPage: 1,\n stageId: '',\n totalItems: 1,\n numOfPages: 1,\n currentPage: 1,\n search: '',\n filterPropertyName: 'hs_pipeline',\n filterOperator: 'eq',\n filterValue: '',\n isPrimaryCompany: null,\n view: null,\n selectedPipeline: '',\n tableParam: {},\n tableDefPermissions: {}\n })\n noteStore.setState({ notes: [], prependNotes: [], id: '', queryParams: null })\n emailStore.setState({ emails: [], prependEmails: [], id: '', queryParams: null })\n userStore.setState({ profile: null })\n syncStore.setState({\n apiSync: false,\n sync: false,\n isSyncLoading: false,\n isSyncDisable: false\n })\n formStore.setState({ form: null })\n fileStore.setState({ files: null, id: '', queryParams: null })\n multiObjectStore.setState({ objects: {}, objectsPrependData: {}, meta: {} })\n}\n\n/**\n * Full client SDK session teardown (cookies, sessionStorage, iframe keys, memory token, CRM stores).\n * Consumer apps should also clear TanStack Query + local UI state after calling this.\n */\nexport function clearClientSdkSession(): void {\n clearClientAuthCookies()\n clearClientIframeRefreshLocalKeys()\n clearAccessToken()\n resetSessionStores()\n resetSessionAuthState()\n clearSessionRefreshExhaustedState()\n}\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\nimport { clearClientSdkSession } from './session-teardown'\nimport { clearAccessToken } from './token-store'\n\nconst REV_KEY = WP_STORAGE_KEYS.c.auth.rev\nconst CHANNEL_NAME = 'woodsportal:session-sync'\n\ntype SessionSyncMessage = { type: 'rev' | 'login'; ts: number }\n\nfunction writeRevSignal(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.setItem(REV_KEY, String(Date.now()))\n } catch {\n // ignore\n }\n}\n\nfunction getBroadcastChannel(): BroadcastChannel | null {\n if (typeof BroadcastChannel === 'undefined') {\n return null\n }\n try {\n return new BroadcastChannel(CHANNEL_NAME)\n } catch {\n return null\n }\n}\n\n/** Notify other tabs that session ended or restarted. */\nexport function signalSessionChanged(kind: 'rev' | 'login' = 'rev'): void {\n writeRevSignal()\n const channel = getBroadcastChannel()\n if (channel) {\n const message: SessionSyncMessage = { type: kind, ts: Date.now() }\n channel.postMessage(message)\n channel.close()\n }\n}\n\nexport type SessionSyncListener = (kind: 'rev' | 'login') => void\n\nlet listenerInstalled = false\nlet broadcastChannel: BroadcastChannel | null = null\nconst listeners = new Set<SessionSyncListener>()\n\nfunction dispatch(kind: 'rev' | 'login'): void {\n listeners.forEach((fn) => {\n try {\n fn(kind)\n } catch {\n // consumer error\n }\n })\n}\n\nfunction handleRemoteSessionChange(kind: 'rev' | 'login'): void {\n if (kind === 'rev') {\n clearAccessToken()\n }\n dispatch(kind)\n}\n\n/**\n * Listen for logout/login in other tabs (localStorage + BroadcastChannel).\n * Returns unsubscribe function.\n */\nexport function installCrossTabSessionListener(onChange?: SessionSyncListener): () => void {\n if (typeof window === 'undefined') {\n return () => undefined\n }\n\n if (onChange) {\n listeners.add(onChange)\n }\n\n if (!listenerInstalled) {\n listenerInstalled = true\n\n window.addEventListener('storage', (event) => {\n if (event.key !== REV_KEY || event.newValue == null) {\n return\n }\n handleRemoteSessionChange('rev')\n })\n\n try {\n broadcastChannel?.close()\n broadcastChannel = new BroadcastChannel(CHANNEL_NAME)\n broadcastChannel.onmessage = (event: MessageEvent<SessionSyncMessage>) => {\n const kind = event.data?.type === 'login' ? 'login' : 'rev'\n handleRemoteSessionChange(kind)\n }\n } catch {\n // BroadcastChannel unavailable\n }\n\n window.addEventListener('pageshow', (event) => {\n if (event.persisted) {\n handleRemoteSessionChange('rev')\n }\n })\n }\n\n return () => {\n if (onChange) {\n listeners.delete(onChange)\n }\n }\n}\n\n/** Remote tab signalled logout — clear readable session artifacts. */\nexport function applyCrossTabSessionRevocation(): void {\n clearClientSdkSession()\n}\n\n/** Test-only: close BroadcastChannel and allow listener reinstall (prevents open-handle hangs). */\nexport function resetCrossTabSessionSyncForTests(): void {\n try {\n broadcastChannel?.close()\n } catch {\n // ignore\n }\n broadcastChannel = null\n listenerInstalled = false\n listeners.clear()\n}\n"]}
1
+ {"version":3,"sources":["../src/main/core/http/session-teardown.ts","../src/main/core/http/cross-tab-session.ts"],"names":["actions"],"mappings":"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","file":"chunk-CJZF3RTE.js","sourcesContent":["import { clearAccessToken, clearSessionRefreshExhaustedState, resetSessionAuthState } from './token-store'\nimport { clearClientAuthCookies } from '../utils/cookie'\nimport { clearClientIframeRefreshLocalKeys } from '../utils/storage-migration'\nimport {\n tableStore,\n tableActions,\n tableUiStore,\n noteStore,\n emailStore,\n userStore,\n syncStore,\n formStore,\n fileStore,\n multiObjectStore\n} from '../../state/index.js'\n\n/** Reset CRM nanostores to empty session state (logout / forced 401). */\nexport function resetSessionStores(): void {\n tableActions.clearTablePrependData()\n tableStore.setState({\n queryParams: null,\n multiObjectsQueryParams: {},\n objectsData: null,\n tableData: [],\n tablePrependData: [],\n hubspotObjectTypeId: '',\n selectedPipeline: '',\n viewType: ''\n })\n tableUiStore.setState({\n tableUniqueId: null,\n gridData: [],\n sort: '-hs_createdate',\n limit: 10,\n after: '',\n page: 1,\n nextPage: 1,\n stageId: '',\n totalItems: 1,\n numOfPages: 1,\n currentPage: 1,\n search: '',\n filterPropertyName: 'hs_pipeline',\n filterOperator: 'eq',\n filterValue: '',\n isPrimaryCompany: null,\n view: null,\n selectedPipeline: '',\n tableParam: {},\n tableDefPermissions: {}\n })\n noteStore.setState({ notes: [], prependNotes: [], id: '', queryParams: null })\n emailStore.setState({ emails: [], prependEmails: [], id: '', queryParams: null })\n userStore.setState({ profile: null })\n syncStore.setState({\n apiSync: false,\n sync: false,\n isSyncLoading: false,\n isSyncDisable: false\n })\n formStore.setState({ form: null })\n fileStore.setState({ files: null, id: '', queryParams: null })\n multiObjectStore.setState({ objects: {}, objectsPrependData: {}, meta: {} })\n}\n\n/**\n * Full client SDK session teardown (cookies, sessionStorage, iframe keys, memory token, CRM stores).\n * Consumer apps should also clear TanStack Query + local UI state after calling this.\n */\nexport function clearClientSdkSession(): void {\n clearClientAuthCookies()\n clearClientIframeRefreshLocalKeys()\n clearAccessToken()\n resetSessionStores()\n resetSessionAuthState()\n clearSessionRefreshExhaustedState()\n}\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\nimport { clearClientSdkSession } from './session-teardown'\nimport { clearAccessToken } from './token-store'\n\nconst REV_KEY = WP_STORAGE_KEYS.c.auth.rev\nconst CHANNEL_NAME = 'woodsportal:session-sync'\n\ntype SessionSyncMessage = { type: 'rev' | 'login'; ts: number }\n\nfunction writeRevSignal(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.setItem(REV_KEY, String(Date.now()))\n } catch {\n // ignore\n }\n}\n\nfunction getBroadcastChannel(): BroadcastChannel | null {\n if (typeof BroadcastChannel === 'undefined') {\n return null\n }\n try {\n return new BroadcastChannel(CHANNEL_NAME)\n } catch {\n return null\n }\n}\n\n/** Notify other tabs that session ended or restarted. */\nexport function signalSessionChanged(kind: 'rev' | 'login' = 'rev'): void {\n writeRevSignal()\n const channel = getBroadcastChannel()\n if (channel) {\n const message: SessionSyncMessage = { type: kind, ts: Date.now() }\n channel.postMessage(message)\n channel.close()\n }\n}\n\nexport type SessionSyncListener = (kind: 'rev' | 'login') => void\n\nlet listenerInstalled = false\nlet broadcastChannel: BroadcastChannel | null = null\nconst listeners = new Set<SessionSyncListener>()\n\nfunction dispatch(kind: 'rev' | 'login'): void {\n listeners.forEach((fn) => {\n try {\n fn(kind)\n } catch {\n // consumer error\n }\n })\n}\n\nfunction handleRemoteSessionChange(kind: 'rev' | 'login'): void {\n if (kind === 'rev') {\n clearAccessToken()\n }\n dispatch(kind)\n}\n\n/**\n * Listen for logout/login in other tabs (localStorage + BroadcastChannel).\n * Returns unsubscribe function.\n */\nexport function installCrossTabSessionListener(onChange?: SessionSyncListener): () => void {\n if (typeof window === 'undefined') {\n return () => undefined\n }\n\n if (onChange) {\n listeners.add(onChange)\n }\n\n if (!listenerInstalled) {\n listenerInstalled = true\n\n window.addEventListener('storage', (event) => {\n if (event.key !== REV_KEY || event.newValue == null) {\n return\n }\n handleRemoteSessionChange('rev')\n })\n\n try {\n broadcastChannel?.close()\n broadcastChannel = new BroadcastChannel(CHANNEL_NAME)\n broadcastChannel.onmessage = (event: MessageEvent<SessionSyncMessage>) => {\n const kind = event.data?.type === 'login' ? 'login' : 'rev'\n handleRemoteSessionChange(kind)\n }\n } catch {\n // BroadcastChannel unavailable\n }\n\n window.addEventListener('pageshow', (event) => {\n if (event.persisted) {\n handleRemoteSessionChange('rev')\n }\n })\n }\n\n return () => {\n if (onChange) {\n listeners.delete(onChange)\n }\n }\n}\n\n/** Remote tab signalled logout — clear readable session artifacts. */\nexport function applyCrossTabSessionRevocation(): void {\n clearClientSdkSession()\n}\n\n/** Test-only: close BroadcastChannel and allow listener reinstall (prevents open-handle hangs). */\nexport function resetCrossTabSessionSyncForTests(): void {\n try {\n broadcastChannel?.close()\n } catch {\n // ignore\n }\n broadcastChannel = null\n listenerInstalled = false\n listeners.clear()\n}\n"]}
@@ -1,7 +1,93 @@
1
- import { getAuthRefreshToken, createMutation, Client } from './chunk-PPZCZJMI.js';
2
- import { getParam, actions6 } from './chunk-4DP7JV7Q.js';
3
- import { hasRefreshSession, isAccessTokenExpired, hydrateSessionRefreshState, clearSessionRefreshExhaustedState, resetSessionAuthState, isRefreshInFlight, isSessionRefreshExhausted, didLastRefreshFail, hasValidAccessToken, isExpiresAccessToken, isAuthenticateApp, isAuthenticated, clearAccessToken, getAccessToken, refreshSession, getRefreshToken, setAccessToken, logger, setPortal, setSubscriptionType, setRefreshToken, setLoggedInDetails, setConfig } from './chunk-B2OVKOJU.js';
4
- import { isCookieExpired, clearClientAuthCookies } from './chunk-YNOZWRK3.js';
1
+ import { getAuthRefreshToken, createMutation, Client } from './chunk-2EFT76XX.js';
2
+ import { getParam, actions6 } from './chunk-2SZ2WQGG.js';
3
+ import { hasRefreshSession, isAccessTokenExpired, hydrateSessionRefreshState, clearSessionRefreshExhaustedState, resetSessionAuthState, isRefreshInFlight, isSessionRefreshExhausted, didLastRefreshFail, hasValidAccessToken, isExpiresAccessToken, isAuthenticateApp, isAuthenticated, clearAccessToken, setAccessToken, getAccessToken, refreshSession, getRefreshToken, logger, setPortal, setSubscriptionType, setRefreshToken, setLoggedInDetails, setConfig } from './chunk-KYZRYIB3.js';
4
+ import { isCookieExpired, clearClientAuthCookies } from './chunk-XANZNL46.js';
5
+ import { WP_STORAGE_KEYS } from './chunk-7JHBCIR5.js';
6
+
7
+ // src/main/core/auth/mfa-pending-token-storage.ts
8
+ function keysForLane(lane) {
9
+ const mfa = lane === "a" ? WP_STORAGE_KEYS.a.mfa : WP_STORAGE_KEYS.c.mfa;
10
+ return {
11
+ token: mfa.pendingToken,
12
+ exp: mfa.pendingTokenExp
13
+ };
14
+ }
15
+ function readExpiresAt(raw) {
16
+ if (raw == null || raw === "") {
17
+ return null;
18
+ }
19
+ const parsed = Number(raw);
20
+ return Number.isFinite(parsed) ? parsed : null;
21
+ }
22
+ function getSessionStorage() {
23
+ if (typeof globalThis === "undefined") {
24
+ return null;
25
+ }
26
+ try {
27
+ return globalThis.sessionStorage ?? null;
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
32
+ function storeMfaPendingAccessToken(token, expiresInSeconds, lane = "c") {
33
+ const storage = getSessionStorage();
34
+ if (!storage) {
35
+ return;
36
+ }
37
+ if (!token || typeof token !== "string") {
38
+ return;
39
+ }
40
+ const keys = keysForLane(lane);
41
+ const expiresAt = typeof expiresInSeconds === "number" && expiresInSeconds > 0 ? Date.now() + expiresInSeconds * 1e3 : Date.now() + 15 * 60 * 1e3;
42
+ try {
43
+ storage.setItem(keys.token, token);
44
+ storage.setItem(keys.exp, String(expiresAt));
45
+ } catch {
46
+ }
47
+ }
48
+ function readMfaPendingAccessToken(lane = "c") {
49
+ const storage = getSessionStorage();
50
+ if (!storage) {
51
+ return null;
52
+ }
53
+ const keys = keysForLane(lane);
54
+ try {
55
+ const token = storage.getItem(keys.token);
56
+ if (!token) {
57
+ return null;
58
+ }
59
+ const expiresAt = readExpiresAt(storage.getItem(keys.exp));
60
+ if (expiresAt == null || Date.now() >= expiresAt) {
61
+ clearMfaPendingAccessToken(lane);
62
+ return null;
63
+ }
64
+ return { token, expiresAt };
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+ function clearMfaPendingAccessToken(lane = "c") {
70
+ const storage = getSessionStorage();
71
+ if (!storage) {
72
+ return;
73
+ }
74
+ const keys = keysForLane(lane);
75
+ try {
76
+ storage.removeItem(keys.token);
77
+ storage.removeItem(keys.exp);
78
+ } catch {
79
+ }
80
+ }
81
+ async function hydrateMfaPendingAccessToken(input) {
82
+ const lane = input.lane ?? "c";
83
+ const pending = readMfaPendingAccessToken(lane);
84
+ if (!pending) {
85
+ return false;
86
+ }
87
+ const ttlSeconds = Math.max(1, Math.floor((pending.expiresAt - Date.now()) / 1e3));
88
+ await input.setAccessToken(pending.token, ttlSeconds);
89
+ return true;
90
+ }
5
91
 
6
92
  // src/main/core/auth/session-contract.ts
7
93
  function hasValidAccess(input) {
@@ -65,6 +151,7 @@ async function completeLoginSession(response) {
65
151
  await setLoggedInDetails(body);
66
152
  actions6.setProfile(response?.data != null ? response : { data: body });
67
153
  setConfig.setDevPortalId(currentPortalId);
154
+ clearMfaPendingAccessToken("c");
68
155
  return response;
69
156
  }
70
157
  async function applyLoginResponse(response) {
@@ -75,6 +162,7 @@ async function applyLoginResponse(response) {
75
162
  const expiresIn = tokenData?.expiresIn;
76
163
  if (token) {
77
164
  await setAccessToken(token, expiresIn);
165
+ storeMfaPendingAccessToken(token, expiresIn, "c");
78
166
  }
79
167
  return response;
80
168
  }
@@ -616,6 +704,7 @@ var authApi = {
616
704
  refreshSession,
617
705
  refreshAccessToken: getAuthRefreshToken,
618
706
  getAccessToken,
707
+ setAccessToken,
619
708
  clearAccessToken,
620
709
  isAuthenticated,
621
710
  isAuthenticateApp,
@@ -654,14 +743,19 @@ var authApi = {
654
743
  };
655
744
 
656
745
  // src/main/core/auth/bootstrap-contract.ts
657
- function recoverMfaGateOnBoot(input) {
746
+ async function recoverMfaGateOnBoot(input) {
658
747
  const hasContext = input.hasMfaContext();
659
- const hasToken = input.hasAccessToken();
748
+ let hasToken = input.hasAccessToken();
660
749
  const hasRefresh = input.hasRefreshToken();
661
750
  if (hasContext && hasToken) {
662
751
  return "pending";
663
752
  }
664
753
  if (hasContext && !hasToken) {
754
+ const hydrated = await input.tryHydrateMfaAccessToken?.();
755
+ hasToken = input.hasAccessToken();
756
+ if (hydrated && hasToken) {
757
+ return "pending";
758
+ }
665
759
  input.clearMfaOrphan();
666
760
  return "orphan_cleared";
667
761
  }
@@ -723,6 +817,6 @@ function resolveAuthRouteAction(input) {
723
817
  return { kind: "allow" };
724
818
  }
725
819
 
726
- export { authApi, hasAuthenticatedAccess, hasValidAccess, isFullyAuthenticated, isMfaPendingSession, recoverMfaGateOnBoot, resolveAuthRouteAction };
727
- //# sourceMappingURL=chunk-ZGA6KXES.js.map
728
- //# sourceMappingURL=chunk-ZGA6KXES.js.map
820
+ export { authApi, clearMfaPendingAccessToken, hasAuthenticatedAccess, hasValidAccess, hydrateMfaPendingAccessToken, isFullyAuthenticated, isMfaPendingSession, readMfaPendingAccessToken, recoverMfaGateOnBoot, resolveAuthRouteAction, storeMfaPendingAccessToken };
821
+ //# sourceMappingURL=chunk-FZYOTYDA.js.map
822
+ //# sourceMappingURL=chunk-FZYOTYDA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main/core/auth/mfa-pending-token-storage.ts","../src/main/core/auth/session-contract.ts","../src/main/core/http/session-persistence-error.ts","../src/main/core/http/login-session.ts","../src/main/features/auth/api/authentication.ts","../src/main/features/auth/api/mfa.ts","../src/main/features/auth/api/security.ts","../src/main/features/auth/api/login-bootstrap.ts","../src/main/features/auth/api/sso.ts","../src/main/features/auth/api/users.ts","../src/main/api/nested-auth-api.ts","../src/main/core/auth/bootstrap-contract.ts","../src/main/core/auth/route-guard-contract.ts"],"names":["actions"],"mappings":"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","file":"chunk-FZYOTYDA.js","sourcesContent":["import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\n\nexport type MfaStorageLane = 'c' | 'a'\n\ntype MfaPendingTokenKeys = {\n token: string\n exp: string\n}\n\nfunction keysForLane(lane: MfaStorageLane): MfaPendingTokenKeys {\n const mfa = lane === 'a' ? WP_STORAGE_KEYS.a.mfa : WP_STORAGE_KEYS.c.mfa\n return {\n token: mfa.pendingToken,\n exp: mfa.pendingTokenExp\n }\n}\n\nexport type MfaPendingAccessToken = {\n token: string\n expiresAt: number\n}\n\nfunction readExpiresAt(raw: string | null): number | null {\n if (raw == null || raw === '') {\n return null\n }\n const parsed = Number(raw)\n return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction getSessionStorage(): Storage | null {\n if (typeof globalThis === 'undefined') {\n return null\n }\n try {\n return globalThis.sessionStorage ?? null\n } catch {\n return null\n }\n}\n\n/** Persist temp MFA access JWT for mid-gate page refresh (tab-scoped sessionStorage). */\nexport function storeMfaPendingAccessToken(token: string, expiresInSeconds: number | undefined, lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n if (!token || typeof token !== 'string') {\n return\n }\n\n const keys = keysForLane(lane)\n const expiresAt =\n typeof expiresInSeconds === 'number' && expiresInSeconds > 0 ? Date.now() + expiresInSeconds * 1000 : Date.now() + 15 * 60 * 1000\n\n try {\n storage.setItem(keys.token, token)\n storage.setItem(keys.exp, String(expiresAt))\n } catch {\n // ignore quota / private mode\n }\n}\n\n/** Read temp MFA JWT if present and not expired. */\nexport function readMfaPendingAccessToken(lane: MfaStorageLane = 'c'): MfaPendingAccessToken | null {\n const storage = getSessionStorage()\n if (!storage) {\n return null\n }\n\n const keys = keysForLane(lane)\n try {\n const token = storage.getItem(keys.token)\n if (!token) {\n return null\n }\n\n const expiresAt = readExpiresAt(storage.getItem(keys.exp))\n if (expiresAt == null || Date.now() >= expiresAt) {\n clearMfaPendingAccessToken(lane)\n return null\n }\n\n return { token, expiresAt }\n } catch {\n return null\n }\n}\n\nexport function clearMfaPendingAccessToken(lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n\n const keys = keysForLane(lane)\n try {\n storage.removeItem(keys.token)\n storage.removeItem(keys.exp)\n } catch {\n // ignore\n }\n}\n\nexport type HydrateMfaPendingAccessTokenInput = {\n lane?: MfaStorageLane\n setAccessToken: (token: string, expiresInSeconds?: number) => void | Promise<void>\n}\n\n/** Restore in-memory MFA temp JWT from sessionStorage after refresh. Returns true when hydrated. */\nexport async function hydrateMfaPendingAccessToken(input: HydrateMfaPendingAccessTokenInput): Promise<boolean> {\n const lane = input.lane ?? 'c'\n const pending = readMfaPendingAccessToken(lane)\n if (!pending) {\n return false\n }\n\n const ttlSeconds = Math.max(1, Math.floor((pending.expiresAt - Date.now()) / 1000))\n await input.setAccessToken(pending.token, ttlSeconds)\n return true\n}\n","/**\n * Shared session predicates for client and admin portals.\n * Apps supply lane-specific refresh hints (cookie name / timing cookie).\n */\n\nexport type SessionContractInput = {\n /** In-memory access JWT present. */\n hasAccessToken: () => boolean\n /** Access JWT expired or within proactive refresh buffer. */\n isAccessTokenExpired: () => boolean\n /** Refresh session still valid (cookie / timing hint). */\n hasRefreshSession: () => boolean\n /** MFA gate: temp JWT + pending context. */\n isMfaPending?: () => boolean\n}\n\nexport function hasValidAccess(input: SessionContractInput): boolean {\n return input.hasAccessToken() && !input.isAccessTokenExpired()\n}\n\nexport function isFullyAuthenticated(input: SessionContractInput): boolean {\n if (input.isMfaPending?.()) {\n return false\n }\n if (hasValidAccess(input)) {\n return true\n }\n return input.hasRefreshSession()\n}\n\nexport function isMfaPendingSession(input: SessionContractInput): boolean {\n return Boolean(input.isMfaPending?.())\n}\n\nexport function hasAuthenticatedAccess(input: SessionContractInput): boolean {\n if (input.isMfaPending?.()) {\n return Boolean(input.hasAccessToken())\n }\n return hasValidAccess(input)\n}\n","/** Thrown when a full login response cannot be persisted (e.g. missing refresh token). */\nexport class SessionPersistenceError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SessionPersistenceError'\n }\n}\n","import { setPortal, setSubscriptionType, setAccessToken, setRefreshToken, setLoggedInDetails } from './auth-utils'\nimport { setConfig } from '../utils/hub-context'\nimport { actions as userActions } from '../../state/crm/use-user'\nimport { SessionPersistenceError } from './session-persistence-error'\nimport { logger } from '../logging/logger'\nimport { clearMfaPendingAccessToken, storeMfaPendingAccessToken } from '../auth/mfa-pending-token-storage.js'\n\nfunction unwrapLoginBody(response: any): Record<string, any> {\n return (response?.data ?? response ?? {}) as Record<string, any>\n}\n\n/**\n * Persists a full authenticated session (access + refresh tokens, portal, login details).\n * Use after successful login or MFA verify when `twoFactorRequired` is false.\n */\nexport async function completeLoginSession(response: any): Promise<any> {\n const body = unwrapLoginBody(response)\n const tokenData: any = body?.tokenData || {}\n const loggedInDetails: any = body?.loggedInDetails || {}\n const currentPortal: any = loggedInDetails?.currentPortal || {}\n const currentPortalId: any = currentPortal?.portalId || null\n const subscriptionType = loggedInDetails?.subscriptionType || 'BASIC'\n\n const token = tokenData?.token\n const refreshToken = tokenData?.refreshToken\n const expiresIn = tokenData?.expiresIn\n const refreshExpiresAt = tokenData?.refreshExpiresAt\n const rExpiresIn = tokenData?.refreshExpiresIn\n\n if (!token || typeof token !== 'string') {\n logger.error('auth', 'login session missing access token', { operation: 'completeLoginSession' })\n throw new SessionPersistenceError('Session persistence failed: missing access token in login response')\n }\n\n if (!refreshToken || typeof refreshToken !== 'string') {\n logger.error('auth', 'login session missing refresh token', { operation: 'completeLoginSession' })\n throw new SessionPersistenceError('Session persistence failed: missing refresh token in login response')\n }\n\n setPortal(currentPortal)\n setSubscriptionType(subscriptionType)\n await setAccessToken(token, expiresIn)\n await setRefreshToken(refreshToken, refreshExpiresAt ?? rExpiresIn)\n await setLoggedInDetails(body)\n userActions.setProfile(response?.data != null ? response : { data: body })\n\n setConfig.setDevPortalId(currentPortalId)\n\n clearMfaPendingAccessToken('c')\n\n return response\n}\n\n/**\n * Applies login/MFA-step response token rules:\n * - MFA pending: temp access JWT only (no refresh until verify completes)\n * - Full session: {@link completeLoginSession}\n */\nexport async function applyLoginResponse(response: any): Promise<any> {\n const data = unwrapLoginBody(response)\n if (data?.twoFactorRequired === true) {\n const tokenData: any = data?.tokenData || {}\n const token = tokenData?.token\n const expiresIn = tokenData?.expiresIn\n if (token) {\n await setAccessToken(token, expiresIn)\n storeMfaPendingAccessToken(token, expiresIn, 'c')\n }\n return response\n }\n return completeLoginSession(response)\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport type {\n LoginPayload,\n LoginResponseData,\n MutationOptions,\n PreLoginPayload,\n ForgetPasswordPayload,\n VerifyEmailPayload,\n ResetPasswordVerifyTokenPayload,\n ResetPasswordPayload\n} from '../../../core/types'\nimport { createMutation } from '../../../core/mutation/createMutation'\nimport { applyLoginResponse } from '../../../core/http/login-session'\nimport { getParam } from '../../../core/utils/param'\nimport { clearClientAuthCookies } from '../../../core/utils/cookie'\nimport { clearAccessToken } from '../../../core/http/token-store'\n\nexport function preLogin(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PreLoginPayload, any>(async (payload: any) => {\n const response: any = await Client.authentication.preLogin(payload)\n return response\n }, options)\n\n return {\n mutate,\n preLogin: mutate,\n isLoading\n }\n}\n\n/**\n * Password login for the client portal.\n *\n * **API:** `POST /api/auth/login?hubId={hubId}`\n * **Session:** When `twoFactorRequired` is true, stores only the temp access JWT (no refresh until MFA completes).\n */\nexport function login(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<LoginPayload, LoginResponseData>(async (payload: any) => {\n const response = (await Client.authentication.login(payload)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n }, options)\n\n return {\n mutate,\n login: mutate,\n isLoading\n }\n}\n\nexport interface ClientSessionPayload {\n accessToken: string\n refreshToken?: string\n}\n\n/**\n * Exchange a management/deep-link token for a portal client session.\n *\n * **API:** `POST /api/auth/client-session`\n * **Auth:** Bearer access token header; optional refresh token in body.\n */\nexport interface AuthHandoffPayload {\n code: string\n hubId: number\n}\n\n/**\n * Redeem a one-time admin portal handoff code for a full client session.\n *\n * **API:** `POST /api/auth/handoff?hubId={hubId}`\n */\nexport function handoff(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<AuthHandoffPayload, LoginResponseData>(async (payload) => {\n const response = (await Client.authentication.handoff(payload!)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n }, options)\n\n return {\n mutate,\n handoff: mutate,\n isLoading\n }\n}\n\nexport function clientSession(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<ClientSessionPayload, LoginResponseData>(async (payload?: ClientSessionPayload) => {\n const response = (await Client.authentication.clientSession(payload!)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n }, options)\n\n return {\n mutate,\n clientSession: mutate,\n isLoading\n }\n}\n\nexport function register(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<any, any>(async (payload: any) => {\n const response: any = await Client.authentication.register(payload)\n return response\n }, options)\n\n return {\n mutate,\n register: mutate,\n isLoading\n }\n}\n\nexport function verifyEmail(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<VerifyEmailPayload, any>(async (payload: any) => {\n const verifyEmailPayload: VerifyEmailPayload = payload || {}\n const token: any = getParam('token')\n if (!verifyEmailPayload?.token) verifyEmailPayload.token = token\n const response: any = await Client.authentication.verifyEmail(verifyEmailPayload)\n return response\n }, options)\n\n return {\n mutate,\n verifyEmail: mutate,\n isLoading\n }\n}\n\nexport function resetPasswordVerifyToken(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<ResetPasswordVerifyTokenPayload, any>(async (payload: any) => {\n const resetPasswordVerifyTokenPayload: ResetPasswordVerifyTokenPayload = payload || {}\n const token: any = getParam('token')\n if (!resetPasswordVerifyTokenPayload?.token) resetPasswordVerifyTokenPayload.token = token\n const response: any = await Client.authentication.resetPasswordVerifyToken(resetPasswordVerifyTokenPayload)\n return response\n }, options)\n\n return {\n mutate,\n resetPasswordVerifyToken: mutate,\n isLoading\n }\n}\n\nexport function resetPassword(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<ResetPasswordPayload, any>(async (payload: any) => {\n const response: any = await Client.authentication.resetPassword(payload)\n return response\n }, options)\n\n return {\n mutate,\n resetPassword: mutate,\n isLoading\n }\n}\n\nexport function forgetPassword(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<ForgetPasswordPayload, any>(async (payload: any) => {\n const response: any = await Client.authentication.forgetPassword(payload)\n return response\n }, options)\n\n return {\n mutate,\n forgetPassword: mutate,\n isLoading\n }\n}\n\nexport function logout(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation(async () => {\n try {\n const response: any = await Client.authentication.logout()\n return response\n } finally {\n clearAccessToken()\n clearClientAuthCookies()\n }\n }, options)\n\n return {\n mutate,\n logout: mutate,\n isLoading\n }\n}\n\nexport function registerExistingUser(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<any, any>(async (payload: any) => {\n const response: any = await Client.authentication.registerExistingUser(payload)\n return response\n }, options)\n\n return {\n mutate,\n registerExistingUser: mutate,\n isLoading\n }\n}\n\nexport function verifyEmailResend(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<any, any>(async (payload: any) => {\n const response: any = await Client.authentication.verifyEmailResend(payload)\n return response\n }, options)\n\n return {\n mutate,\n verifyEmailResend: mutate,\n isLoading\n }\n}\n\nexport function resendEmail(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<any, any>(async (payload: any) => {\n const response: any = await Client.authentication.resendEmail(payload)\n return response\n }, options)\n\n return {\n mutate,\n resendEmail: mutate,\n isLoading\n }\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport { createMutation } from '../../../core/mutation/createMutation'\nimport { applyLoginResponse } from '../../../core/http/login-session'\nimport type {\n LoginResponseData,\n MfaEnrollmentStatus,\n MfaOtpSendRequest,\n MfaPendingPasskeyOptionsRequest,\n MfaPendingPasskeyVerifyRequest,\n MfaPreferenceRequest,\n MfaStatusQuery,\n MutationOptions,\n PasskeyLoginOptionsRequest,\n PasskeyLoginVerifyRequest,\n PhoneVerifyConfirmRequest,\n PhoneVerifyStartRequest,\n BackupCodesRegenerateRequest,\n MfaBackupCodesResponse,\n MfaOptOutRequest,\n PhoneUnverifyRequest,\n TotpDisableRequest,\n TotpEnrollVerifyRequest,\n TwoFaVerificationRequest,\n WebAuthnVerifyRequest\n} from '../../../core/types'\n\n/**\n * Complete the MFA login step after `api.login()` returned `twoFactorRequired: true`.\n *\n * **API:** `POST /api/auth/verify-otp?hubId={hubId}`\n * **Auth:** Bearer temp JWT; body `{ token, otp, method }` (`EMAIL_OTP` | `SMS_OTP` | `TOTP` | `BACKUP_CODE`).\n * **Session:** On success persists full access + refresh tokens (skips when still MFA-pending).\n */\nexport function verifyOtp(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<TwoFaVerificationRequest, LoginResponseData>(async (payload?: TwoFaVerificationRequest) => {\n const response = (await Client.authentication.verifyOtp(payload!)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n }, options)\n\n return { mutate, verifyOtp: mutate, isLoading }\n}\n\n/**\n * Resend OTP or switch to email/SMS on the MFA login gate.\n *\n * **API:** `POST /api/auth/mfa/pending/otp/send`\n * **Auth:** Bearer temp JWT; body `{ token, method }`.\n */\nexport function sendMfaOtp(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaOtpSendRequest, any>(\n async (payload?: MfaOtpSendRequest) => Client.mfa.sendPendingOtp(payload!),\n options\n )\n\n return { mutate, sendOtp: mutate, sendMfaOtp: mutate, isLoading }\n}\n\n/**\n * Start WebAuthn ceremony for passkey as second factor during login.\n *\n * **API:** `POST /api/auth/mfa/pending/passkey/authenticate/options`\n * **Auth:** Bearer temp JWT; body `{ token, portalId? }`.\n */\nexport function pendingPasskeyOptions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaPendingPasskeyOptionsRequest, any>(\n async (payload?: MfaPendingPasskeyOptionsRequest) => Client.mfa.pendingPasskeyOptions(payload!),\n options\n )\n\n return { mutate, pendingPasskeyOptions: mutate, isLoading }\n}\n\n/**\n * Finish passkey MFA-step and complete login when successful.\n *\n * **API:** `POST /api/auth/mfa/pending/passkey/authenticate/verify?hubId={hubId}`\n * **Auth:** Bearer temp JWT; body `{ token, challengeId, credential, portalId? }`.\n * **Session:** On success persists full access + refresh tokens.\n */\nexport function pendingPasskeyVerify(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<MfaPendingPasskeyVerifyRequest, LoginResponseData>(\n async (payload?: MfaPendingPasskeyVerifyRequest) => {\n const response = (await Client.mfa.pendingPasskeyVerify(payload!)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n },\n options\n )\n\n return { mutate, pendingPasskeyVerify: mutate, isLoading }\n}\n\n/**\n * MFA enrollment and policy snapshot for the security settings UI.\n *\n * **API:** `GET /api/auth/mfa/status?portalId={portalId}`\n * **Auth:** Bearer access JWT (full session).\n */\nexport function getMfaStatus(options?: MutationOptions<MfaEnrollmentStatus, any>) {\n const { mutate, isLoading } = createMutation<MfaStatusQuery | undefined, MfaEnrollmentStatus>(\n async (payload) => (await Client.mfa.getStatus(payload)) as MfaEnrollmentStatus,\n options\n )\n\n return { mutate, getStatus: mutate, getMfaStatus: mutate, isLoading }\n}\n\n/**\n * Set the user's default MFA method for this hub/portal scope.\n *\n * **API:** `PUT /api/auth/mfa/preferences?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ defaultMethod }`.\n */\nexport function setMfaPreferences(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaPreferenceRequest & MfaStatusQuery, any>(\n async (payload?: MfaPreferenceRequest & MfaStatusQuery) => {\n const { portalId, ...data } = payload!\n return Client.mfa.setPreferences(data, { portalId })\n },\n options\n )\n\n return { mutate, setPreferences: mutate, setMfaPreferences: mutate, isLoading }\n}\n\n/**\n * Send OTP to verify the user's phone number (enables SMS OTP at login).\n *\n * **API:** `POST /api/auth/mfa/phone/verify/start?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ phone }` (E.164, e.g. `+14155552671`).\n */\nexport function startPhoneVerify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PhoneVerifyStartRequest & MfaStatusQuery, any>(async (payload) => {\n const { portalId, ...data } = payload ?? { phone: '' }\n return Client.mfa.startPhoneVerify(data, portalId != null ? { portalId } : undefined)\n }, options)\n\n return { mutate, startPhoneVerify: mutate, isLoading }\n}\n\n/**\n * Confirm phone verification with the OTP code.\n *\n * **API:** `POST /api/auth/mfa/phone/verify/confirm?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ phone, code }`.\n */\nexport function confirmPhoneVerify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PhoneVerifyConfirmRequest & MfaStatusQuery, any>(async (payload) => {\n const { portalId, ...data } = payload ?? { phone: '', code: '' }\n return Client.mfa.confirmPhoneVerify(data, portalId != null ? { portalId } : undefined)\n }, options)\n\n return { mutate, confirmPhoneVerify: mutate, isLoading }\n}\n\n/**\n * Start TOTP authenticator enrollment for the current portal scope.\n *\n * **API:** `POST /api/auth/mfa/totp/enroll/start?portalId={portalId}`\n * **Auth:** Bearer access JWT. Returns `secret`, `otpauthUri`, `scopeKey`.\n */\nexport function totpEnrollStart(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaStatusQuery | undefined, any>(async (payload) => Client.mfa.totpEnrollStart(payload), options)\n\n return { mutate, totpEnrollStart: mutate, isLoading }\n}\n\n/**\n * Confirm TOTP enrollment and receive one-time backup codes.\n *\n * **API:** `POST /api/auth/mfa/totp/enroll/verify?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ code, portalId? }`.\n */\nexport function totpEnrollVerify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<TotpEnrollVerifyRequest, any>(\n async (payload?: TotpEnrollVerifyRequest) => Client.mfa.totpEnrollVerify(payload!),\n options\n )\n\n return { mutate, totpEnrollVerify: mutate, isLoading }\n}\n\n/**\n * Disable TOTP for the current scope (requires current password).\n *\n * **API:** `POST /api/auth/mfa/totp/disable`\n * **Auth:** Bearer access JWT; body `{ password }`.\n */\nexport function totpDisable(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<TotpDisableRequest & MfaStatusQuery, any>(async (payload?: TotpDisableRequest & MfaStatusQuery) => {\n const { portalId, ...data } = payload!\n return Client.mfa.totpDisable(data, { portalId })\n }, options)\n\n return { mutate, totpDisable: mutate, isLoading }\n}\n\n/**\n * Remove SMS MFA by clearing phone verification for the current scope.\n *\n * **API:** `POST /api/auth/mfa/phone/unverify?portalId={portalId}`\n */\nexport function phoneUnverify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PhoneUnverifyRequest & MfaStatusQuery, any>(\n async (payload?: PhoneUnverifyRequest & MfaStatusQuery) => {\n const { portalId, ...data } = payload!\n return Client.mfa.phoneUnverify(data, { portalId })\n },\n options\n )\n\n return { mutate, phoneUnverify: mutate, isLoading }\n}\n\n/**\n * Regenerate backup codes (password + TOTP step-up). Plaintext codes returned once.\n *\n * **API:** `POST /api/auth/mfa/backup-codes/regenerate?portalId={portalId}`\n */\nexport function backupCodesRegenerate(options?: MutationOptions<MfaBackupCodesResponse, any>) {\n const { mutate, isLoading } = createMutation<BackupCodesRegenerateRequest & MfaStatusQuery, MfaBackupCodesResponse>(\n async (payload?: BackupCodesRegenerateRequest & MfaStatusQuery) => {\n const { portalId, ...data } = payload!\n return Client.mfa.backupCodesRegenerate(data, { portalId })\n },\n options\n )\n\n return { mutate, backupCodesRegenerate: mutate, isLoading }\n}\n\n/**\n * Turn off all voluntary MFA enrollments when policy allows.\n *\n * **API:** `POST /api/auth/mfa/opt-out?portalId={portalId}`\n */\nexport function mfaOptOut(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaOptOutRequest & MfaStatusQuery, any>(async (payload?: MfaOptOutRequest & MfaStatusQuery) => {\n const { portalId, ...data } = payload!\n return Client.mfa.optOut(data, { portalId })\n }, options)\n\n return { mutate, optOut: mutate, mfaOptOut: mutate, isLoading }\n}\n\n/**\n * Start passkey (WebAuthn) registration ceremony.\n *\n * **API:** `POST /api/auth/mfa/webauthn/register/options?portalId={portalId}`\n * **Auth:** Bearer access JWT.\n */\nexport function webauthnRegisterOptions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaStatusQuery | undefined, any>(\n async (payload) => Client.mfa.webauthnRegisterOptions(payload),\n options\n )\n\n return { mutate, webauthnRegisterOptions: mutate, isLoading }\n}\n\n/**\n * Complete passkey registration after `@simplewebauthn/browser` ceremony.\n *\n * **API:** `POST /api/auth/mfa/webauthn/register/verify?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ challengeId, credential, nickname?, portalId? }`.\n */\nexport function webauthnRegisterVerify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<WebAuthnVerifyRequest, any>(\n async (payload?: WebAuthnVerifyRequest) => Client.mfa.webauthnRegisterVerify(payload!),\n options\n )\n\n return { mutate, webauthnRegisterVerify: mutate, isLoading }\n}\n\n/**\n * Start passkey authentication ceremony while logged in (re-verify).\n *\n * **API:** `POST /api/auth/mfa/webauthn/authenticate/options?portalId={portalId}`\n * **Auth:** Bearer access JWT.\n */\nexport function webauthnAuthOptions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaStatusQuery | undefined, any>(async (payload) => Client.mfa.webauthnAuthOptions(payload), options)\n\n return { mutate, webauthnAuthOptions: mutate, isLoading }\n}\n\n/**\n * Complete logged-in passkey re-verification.\n *\n * **API:** `POST /api/auth/mfa/webauthn/authenticate/verify?portalId={portalId}`\n * **Auth:** Bearer access JWT; body `{ challengeId, credential, portalId? }`.\n */\nexport function webauthnAuthVerify(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<WebAuthnVerifyRequest, any>(\n async (payload?: WebAuthnVerifyRequest) => Client.mfa.webauthnAuthVerify(payload!),\n options\n )\n\n return { mutate, webauthnAuthVerify: mutate, isLoading }\n}\n\n/**\n * List passkeys registered for the portal scope.\n *\n * **API:** `GET /api/auth/mfa/webauthn/credentials?portalId={portalId}`\n * **Auth:** Bearer access JWT.\n */\nexport function listWebauthnCredentials(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<MfaStatusQuery | undefined, any>(\n async (payload) => Client.mfa.listWebauthnCredentials(payload),\n options\n )\n\n return { mutate, listWebauthnCredentials: mutate, isLoading }\n}\n\n/**\n * Remove a registered passkey.\n *\n * **API:** `DELETE /api/auth/mfa/webauthn/credentials/{credentialRecordId}?portalId={portalId}`\n * **Auth:** Bearer access JWT.\n */\nexport function deleteWebauthnCredential(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<{ credentialRecordId: string | number } & MfaStatusQuery, any>(\n async (payload?: { credentialRecordId: string | number } & MfaStatusQuery) => {\n const { credentialRecordId, portalId } = payload!\n return Client.mfa.deleteWebauthnCredential(credentialRecordId, { portalId })\n },\n options\n )\n\n return { mutate, deleteWebauthnCredential: mutate, isLoading }\n}\n\n/**\n * Start passwordless passkey login (when `PASSKEY_PRIMARY` is allowed).\n *\n * **API:** `POST /api/auth/passkey/login/options?hubId={hubId}`\n * **Auth:** Public; body `{ email, hubId?, portalId? }`.\n */\nexport function passkeyLoginOptions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PasskeyLoginOptionsRequest, any>(\n async (payload?: PasskeyLoginOptionsRequest) => Client.mfa.passkeyLoginOptions(payload!),\n options\n )\n\n return { mutate, passkeyLoginOptions: mutate, isLoading }\n}\n\n/**\n * Finish passwordless passkey login; may return `twoFactorRequired` if policy requires MFA.\n *\n * **API:** `POST /api/auth/passkey/login/verify?hubId={hubId}`\n * **Auth:** Public; body `{ challengeId, credential, portalId? }`.\n * **Session:** Applies MFA-aware token rules via {@link applyLoginResponse}.\n */\nexport function passkeyLoginVerify(options?: MutationOptions<LoginResponseData, any>) {\n const { mutate, isLoading } = createMutation<PasskeyLoginVerifyRequest, LoginResponseData>(async (payload?: PasskeyLoginVerifyRequest) => {\n const response = (await Client.mfa.passkeyLoginVerify(payload!)) as LoginResponseData\n await applyLoginResponse(response)\n return response\n }, options)\n\n return { mutate, passkeyLoginVerify: mutate, isLoading }\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport { createMutation } from '../../../core/mutation/createMutation'\nimport type {\n MutationOptions,\n RevokeSecuritySessionPayload,\n SecurityLoginActivityQuery,\n SecurityOverviewQuery,\n SecuritySessionsQuery\n} from '../../../core/types'\n\n/**\n * Security settings overview (password age, MFA methods, policy flags).\n * Use this for the Security page — not `api.me()` + `api.getMfaStatus()`.\n *\n * **API:** `GET /api/auth/security/overview?portalId={portalId}`\n * **Auth:** Bearer access JWT.\n */\nexport function getSecurityOverview(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<SecurityOverviewQuery | undefined, any>(\n async (payload) => Client.security.getOverview(payload),\n options\n )\n\n return { mutate, getOverview: mutate, getSecurityOverview: mutate, isLoading }\n}\n\n/**\n * Paginated login activity for the Security page.\n *\n * **API:** `GET /api/auth/security/login-activity?page=&limit=&sort=`\n * **Auth:** Bearer access JWT.\n */\nexport function getSecurityLoginActivity(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<SecurityLoginActivityQuery | undefined, any>(\n async (payload) => Client.security.getLoginActivity(payload),\n options\n )\n\n return { mutate, getLoginActivity: mutate, getSecurityLoginActivity: mutate, isLoading }\n}\n\n/**\n * List active sessions (refresh-token families) for the Security page.\n *\n * **API:** `GET /api/auth/security/sessions?currentFamilyId=`\n * **Auth:** Bearer access JWT; optional `refreshToken` in payload → `X-Refresh-Token` header to mark current session.\n */\nexport function getSecuritySessions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<SecuritySessionsQuery | undefined, any>(\n async (payload) => Client.security.getSessions(payload),\n options\n )\n\n return { mutate, getSessions: mutate, getSecuritySessions: mutate, isLoading }\n}\n\n/**\n * Sign out a single device/session by `familyId`.\n *\n * **API:** `POST /api/auth/security/sessions/{familyId}/revoke`\n * **Auth:** Bearer access JWT; optional `refreshToken` in payload.\n */\nexport function revokeSecuritySession(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<RevokeSecuritySessionPayload, any>(\n async (payload?: RevokeSecuritySessionPayload) => Client.security.revokeSession(payload!),\n options\n )\n\n return { mutate, revokeSession: mutate, revokeSecuritySession: mutate, isLoading }\n}\n\n/**\n * Sign out all other devices; keeps the current session when `refreshToken` is provided.\n *\n * **API:** `POST /api/auth/security/sessions/revoke-others`\n * **Auth:** Bearer access JWT; optional `refreshToken` in payload → `X-Refresh-Token` header.\n */\nexport function revokeOtherSecuritySessions(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<{ refreshToken?: string } | undefined, any>(\n async (payload) => Client.security.revokeOtherSessions(payload?.refreshToken),\n options\n )\n\n return { mutate, revokeOtherSessions: mutate, revokeOtherSecuritySessions: mutate, isLoading }\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport type { MutationOptions } from '../../../core/types'\nimport { createMutation } from '../../../core/mutation/createMutation'\n\nexport function getLoginBootstrap(options?: MutationOptions<any, { hubId?: number; portalId?: number } | void>) {\n const { mutate, isLoading } = createMutation(async (payload?: { hubId?: number; portalId?: number }) => {\n const response: any = await Client.authentication.getLoginBootstrap(payload)\n return response\n }, options)\n\n return {\n mutate,\n getLoginBootstrap: mutate,\n isLoading\n }\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport type { MutationOptions, PreLoginPayload } from '../../../core/types'\nimport { createMutation } from '../../../core/mutation/createMutation'\nimport { applyLoginResponse } from '../../../core/http/login-session'\n\nexport function getSsoDetails(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation(async () => {\n const response: any = await Client.sso.getSsoDetails()\n return response\n }, options)\n\n return {\n mutate,\n getDetails: mutate,\n getSsoDetails: mutate,\n isLoading\n }\n}\n\nexport function generateSsoUrl(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PreLoginPayload, any>(async (payload: any) => {\n const response: any = await Client.sso.generateSsoUrl(payload)\n return response\n }, options)\n\n return {\n mutate,\n generateUrl: mutate,\n generateSsoUrl: mutate,\n isLoading\n }\n}\n\nexport function ssoCallback(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<PreLoginPayload, any>(async (payload: any) => {\n const response: any = await Client.sso.ssoCallback(payload)\n await applyLoginResponse(response)\n return response\n }, options)\n\n return {\n mutate,\n callback: mutate,\n ssoCallback: mutate,\n isLoading\n }\n}\n","import { Client } from '../../../core/http/client-assembler'\nimport type { ChangePasswordPayload, MutationOptions } from '../../../core/types'\nimport { createMutation } from '../../../core/mutation/createMutation'\nimport { actions as userActions } from '../../../state/crm/use-user'\n\nlet meRequestInFlight: Promise<any> | null = null\n\nasync function fetchMeOnce() {\n if (!meRequestInFlight) {\n meRequestInFlight = Client.user.me().finally(() => {\n meRequestInFlight = null\n })\n }\n return meRequestInFlight\n}\n\nexport function me(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation(async () => {\n const response: any = await fetchMeOnce()\n userActions.setProfile(response)\n return response?.data\n }, options)\n\n return {\n mutate,\n me: mutate,\n isLoading\n }\n}\n\nexport function profile(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation(async (paylaod: any) => {\n const response: any = await Client.user.profile(paylaod)\n return response\n }, options)\n\n return {\n mutate,\n profile: mutate,\n isLoading\n }\n}\n\nexport function profileUpdate(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation(async (paylaod: any) => {\n const response: any = await Client.user.profileUpdate(paylaod)\n return response\n }, options)\n\n return {\n mutate,\n updateProfile: mutate,\n profileUpdate: mutate,\n isLoading\n }\n}\n\n/** @deprecated Use {@link profileUpdate} — same factory; 3.0 nested key is `updateProfile`. */\nexport const updateProfile = profileUpdate\n\nexport function changePassword(options?: MutationOptions<any, any>) {\n const { mutate, isLoading } = createMutation<ChangePasswordPayload, any>(async (payload: any) => {\n const response: any = await Client.user.changePassword(payload)\n return response\n }, options)\n\n return {\n mutate,\n changePassword: mutate,\n isLoading\n }\n}\n","import {\n preLogin,\n login,\n clientSession,\n handoff,\n register,\n verifyEmail,\n forgetPassword,\n logout,\n resetPasswordVerifyToken,\n resetPassword,\n registerExistingUser,\n verifyEmailResend,\n resendEmail\n} from '../features/auth/api/authentication'\nimport {\n verifyOtp,\n sendMfaOtp,\n pendingPasskeyOptions,\n pendingPasskeyVerify,\n getMfaStatus,\n setMfaPreferences,\n startPhoneVerify,\n confirmPhoneVerify,\n totpEnrollStart,\n totpEnrollVerify,\n totpDisable,\n phoneUnverify,\n backupCodesRegenerate,\n mfaOptOut,\n webauthnRegisterOptions,\n webauthnRegisterVerify,\n webauthnAuthOptions,\n webauthnAuthVerify,\n listWebauthnCredentials,\n deleteWebauthnCredential,\n passkeyLoginOptions,\n passkeyLoginVerify\n} from '../features/auth/api/mfa'\nimport {\n getSecurityOverview,\n getSecurityLoginActivity,\n getSecuritySessions,\n revokeSecuritySession,\n revokeOtherSecuritySessions\n} from '../features/auth/api/security'\nimport { getLoginBootstrap } from '../features/auth/api/login-bootstrap'\nimport { getSsoDetails, generateSsoUrl, ssoCallback } from '../features/auth/api/sso'\nimport { changePassword, me, profile, profileUpdate } from '../features/auth/api/users'\nimport { getRefreshToken, setAccessToken as persistAccessToken } from '../core/http/auth-utils'\nimport { getAuthRefreshToken } from '../core/http/http-client'\nimport {\n clearAccessToken,\n didLastRefreshFail,\n getAccessToken,\n isAuthenticateApp,\n isAuthenticated,\n isExpiresAccessToken,\n isAccessTokenExpired,\n hasRefreshSession,\n hasValidAccessToken,\n isRefreshInFlight,\n isSessionRefreshExhausted,\n refreshSession,\n resetSessionAuthState,\n clearSessionRefreshExhaustedState,\n hydrateSessionRefreshState\n} from '../core/http/token-store'\nimport { isCookieExpired } from '../core/utils/cookie'\nimport {\n hasValidAccess,\n isFullyAuthenticated as isFullyAuthenticatedContract,\n hasAuthenticatedAccess as hasAuthenticatedAccessContract,\n type SessionContractInput\n} from '../core/auth/session-contract'\n\n/** Canonical nested auth API (SDK 3.0). */\nexport const authApi = {\n preLogin,\n login,\n clientSession,\n handoff,\n logout,\n register,\n verifyEmail,\n registerExistingUser,\n forgetPassword,\n resetPassword,\n resetPasswordVerifyToken,\n verifyEmailResend,\n resendEmail,\n changePassword,\n me,\n profile,\n updateProfile: profileUpdate,\n mfa: {\n verifyOtp,\n sendOtp: sendMfaOtp,\n pendingPasskeyOptions,\n pendingPasskeyVerify,\n getStatus: getMfaStatus,\n setPreferences: setMfaPreferences,\n startPhoneVerify,\n confirmPhoneVerify,\n totpEnrollStart,\n totpEnrollVerify,\n totpDisable,\n phoneUnverify,\n backupCodesRegenerate,\n optOut: mfaOptOut,\n mfaOptOut,\n webauthnRegisterOptions,\n webauthnRegisterVerify,\n webauthnAuthOptions,\n webauthnAuthVerify,\n listWebauthnCredentials,\n deleteWebauthnCredential,\n passkeyLoginOptions,\n passkeyLoginVerify\n },\n security: {\n getOverview: getSecurityOverview,\n getLoginActivity: getSecurityLoginActivity,\n getSessions: getSecuritySessions,\n revokeSession: revokeSecuritySession,\n revokeOtherSessions: revokeOtherSecuritySessions\n },\n loginBootstrap: getLoginBootstrap,\n sso: {\n getDetails: getSsoDetails,\n generateUrl: generateSsoUrl,\n callback: ssoCallback\n },\n session: {\n getRefreshToken,\n refreshSession,\n refreshAccessToken: getAuthRefreshToken,\n getAccessToken,\n setAccessToken: persistAccessToken,\n clearAccessToken,\n isAuthenticated,\n isAuthenticateApp,\n isAccessTokenExpired,\n isExpiresAccessToken,\n isCookieExpired,\n hasRefreshSession,\n hasValidAccessToken,\n didLastRefreshFail,\n isSessionRefreshExhausted,\n isRefreshInFlight,\n resetSessionAuthState,\n clearSessionRefreshExhaustedState,\n hydrateSessionRefreshState,\n contract: (): SessionContractInput => ({\n hasAccessToken: () => Boolean(getAccessToken()),\n isAccessTokenExpired: isAccessTokenExpired,\n hasRefreshSession\n }),\n isFullyAuthenticated: () =>\n isFullyAuthenticatedContract({\n hasAccessToken: () => Boolean(getAccessToken()),\n isAccessTokenExpired: isAccessTokenExpired,\n hasRefreshSession\n }),\n hasAuthenticatedAccess: () =>\n hasAuthenticatedAccessContract({\n hasAccessToken: () => Boolean(getAccessToken()),\n isAccessTokenExpired: isAccessTokenExpired,\n hasRefreshSession\n }),\n hasValidAccess: () =>\n hasValidAccess({\n hasAccessToken: () => Boolean(getAccessToken()),\n isAccessTokenExpired: isAccessTokenExpired,\n hasRefreshSession\n })\n }\n}\n","export type MfaBootRecoveryResult = 'pending' | 'orphan_cleared' | 'stale_token_cleared' | 'none'\n\nexport type MfaBootRecoveryInput = {\n hasMfaContext: () => boolean\n hasAccessToken: () => boolean\n hasRefreshToken: () => boolean\n clearMfaOrphan: () => void\n clearStaleAccessToken: () => void\n /** Restore temp MFA JWT from sessionStorage after refresh. Return true when hydrated. */\n tryHydrateMfaAccessToken?: () => boolean | Promise<boolean>\n}\n\n/**\n * Normalize MFA gate state on cold load before the router mounts.\n * When sessionStorage holds a valid temp MFA JWT, hydrates in-memory access token so MFA can resume.\n */\nexport async function recoverMfaGateOnBoot(input: MfaBootRecoveryInput): Promise<MfaBootRecoveryResult> {\n const hasContext = input.hasMfaContext()\n let hasToken = input.hasAccessToken()\n const hasRefresh = input.hasRefreshToken()\n\n if (hasContext && hasToken) {\n return 'pending'\n }\n\n if (hasContext && !hasToken) {\n const hydrated = await input.tryHydrateMfaAccessToken?.()\n hasToken = input.hasAccessToken()\n if (hydrated && hasToken) {\n return 'pending'\n }\n input.clearMfaOrphan()\n return 'orphan_cleared'\n }\n\n if (hasToken && !hasContext && !hasRefresh) {\n input.clearStaleAccessToken()\n return 'stale_token_cleared'\n }\n\n return 'none'\n}\n\nexport type { VisibilityRefreshOptions } from '../http/visibility-refresh-scheduler.js'\nexport { startVisibilityRefreshScheduler, stopVisibilityRefreshScheduler } from '../http/visibility-refresh-scheduler.js'\n","import { hasValidAccess, isFullyAuthenticated, isMfaPendingSession, type SessionContractInput } from './session-contract.js'\n\nexport type AuthRouteAction =\n | { kind: 'allow' }\n | { kind: 'show_loader' }\n | { kind: 'redirect_login'; returnUrl?: string }\n | { kind: 'redirect_mfa' }\n | { kind: 'redirect_funnel'; step: 'email_verify' | 'hub_select' | 'portal_select' }\n\nexport type AuthFunnelState = {\n emailVerified?: boolean\n hubId?: number | string | null\n portalId?: number | string | null\n}\n\nexport type ResolveAuthRouteActionInput = {\n pathname: string\n isPublicAuthRoute: (pathname: string) => boolean\n session: SessionContractInput\n funnel?: AuthFunnelState\n mfaRoute: string\n previewMode?: boolean\n /** When refresh hint exists but access token missing — session restoring. */\n sessionRestoring?: boolean\n /** Refresh already failed — do not show restoring loader; redirect to login. */\n sessionRefreshExhausted?: boolean\n}\n\nexport function resolveAuthRouteAction(input: ResolveAuthRouteActionInput): AuthRouteAction {\n const {\n pathname,\n isPublicAuthRoute,\n session,\n funnel,\n mfaRoute,\n previewMode = false,\n sessionRestoring = false,\n sessionRefreshExhausted = false\n } = input\n\n if (previewMode) {\n return { kind: 'allow' }\n }\n\n if (isMfaPendingSession(session)) {\n if (pathname === mfaRoute) {\n return { kind: 'allow' }\n }\n return { kind: 'redirect_mfa' }\n }\n\n if (sessionRestoring && !sessionRefreshExhausted) {\n return { kind: 'show_loader' }\n }\n\n if (sessionRefreshExhausted && !hasValidAccess(session)) {\n if (isPublicAuthRoute(pathname)) {\n return { kind: 'allow' }\n }\n return { kind: 'redirect_login' }\n }\n\n const authenticated = isFullyAuthenticated(session)\n\n if (!authenticated) {\n if (isPublicAuthRoute(pathname)) {\n return { kind: 'allow' }\n }\n return { kind: 'redirect_login' }\n }\n\n if (funnel) {\n if (funnel.emailVerified === false) {\n return { kind: 'redirect_funnel', step: 'email_verify' }\n }\n if (!funnel.hubId) {\n return { kind: 'redirect_funnel', step: 'hub_select' }\n }\n if (!funnel.portalId) {\n return { kind: 'redirect_funnel', step: 'portal_select' }\n }\n }\n\n return { kind: 'allow' }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { getStorageKeys, isCookieExpired, getCookie, isCorruptCookieRawValue, stringifyCookieValue, setCookie, parseCookieJson } from './chunk-YNOZWRK3.js';
2
- import { WP_STORAGE_KEYS, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './chunk-BKT4MFQM.js';
1
+ import { getStorageKeys, isCookieExpired, getCookie, isCorruptCookieRawValue, stringifyCookieValue, setCookie, parseCookieJson } from './chunk-XANZNL46.js';
2
+ import { WP_STORAGE_KEYS, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './chunk-7JHBCIR5.js';
3
3
  import axios from 'axios';
4
4
 
5
5
  // src/main/core/utils/constants.ts
@@ -450,9 +450,9 @@ async function refreshSession(options = {}) {
450
450
  }
451
451
  if (!refreshPromise) {
452
452
  refreshPromise = (async () => {
453
- const { withRefreshLock } = await import('./refresh-lock-JQVP4YOS.js');
453
+ const { withRefreshLock } = await import('./refresh-lock-H6P2SXGP.js');
454
454
  await withRefreshLock(async () => {
455
- const { getRefreshToken: getRefreshToken2 } = await import('./auth-utils-Z5P6SMLJ.js');
455
+ const { getRefreshToken: getRefreshToken2 } = await import('./auth-utils-DM4YHWIH.js');
456
456
  const refreshToken = getRefreshToken2();
457
457
  if (!refreshToken) {
458
458
  markRefreshFailed();
@@ -629,5 +629,5 @@ function getSubscriptionType() {
629
629
  }
630
630
 
631
631
  export { DEV_API_URL, DEV_PORTAL_ID, HUBSPOT_DATA, HUB_ID, clearAccessToken, clearSessionRefreshExhaustedState, config, configureLogger, didLastRefreshFail, ensureValidRefresh, getAccessToken, getPortal, getProfile, getRefreshToken, getSubscriptionType, hasRefreshSession, hasValidAccessToken, hydrateSessionRefreshState, isAccessTokenExpired, isAuthenticateApp, isAuthenticated, isExpiresAccessToken, isHttpTracingEnabled, isRefreshInFlight, isSessionRefreshExhausted, logger, refreshSession, resetSessionAuthState, sanitizeAxiosErrorData, setAccessToken, setConfig, setIframeStorageMode, setLoggedInDetails, setPortal, setProfileDetails, setRefreshBufferSeconds, setRefreshCallback, setRefreshToken, setRuntimeHttpClientHubContext, setSessionLifecycleListener, setSubscriptionType, storAccessToken, storage };
632
- //# sourceMappingURL=chunk-B2OVKOJU.js.map
633
- //# sourceMappingURL=chunk-B2OVKOJU.js.map
632
+ //# sourceMappingURL=chunk-KYZRYIB3.js.map
633
+ //# sourceMappingURL=chunk-KYZRYIB3.js.map