@burtson-labs/bandit-engine 2.0.165 → 2.0.167

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 (61) hide show
  1. package/README.md +4 -1
  2. package/dist/aiProviderStore-HY5G4QAK.mjs +8 -0
  3. package/dist/chat-6N5B7A7F.mjs +15 -0
  4. package/dist/chat-provider.js +175 -109
  5. package/dist/chat-provider.js.map +1 -1
  6. package/dist/chat-provider.mjs +6 -7
  7. package/dist/{chunk-FEIDGXVR.mjs → chunk-46OGYEME.mjs} +24 -6
  8. package/dist/{chunk-FEIDGXVR.mjs.map → chunk-46OGYEME.mjs.map} +1 -1
  9. package/dist/{chunk-ASWUEAWM.mjs → chunk-5BZWJQ5O.mjs} +2 -2
  10. package/dist/{chunk-LKGBO5OP.mjs → chunk-CABOLDNR.mjs} +12 -84
  11. package/dist/chunk-CABOLDNR.mjs.map +1 -0
  12. package/dist/{chunk-NGGTQVGX.mjs → chunk-E5WMDLE3.mjs} +3 -3
  13. package/dist/{chunk-J6LSSK3G.mjs → chunk-GRPTCHFN.mjs} +149 -41
  14. package/dist/chunk-GRPTCHFN.mjs.map +1 -0
  15. package/dist/{chunk-RLW4RBIR.mjs → chunk-KDIL5WUL.mjs} +4 -4
  16. package/dist/{chunk-6VDL4SLX.mjs → chunk-N4BQ6HKL.mjs} +5 -5
  17. package/dist/{chunk-RNCASZ2Y.mjs → chunk-PK3LFBGC.mjs} +10 -10
  18. package/dist/{chunk-WSUUW7T2.mjs → chunk-SHYNXDRO.mjs} +10 -7
  19. package/dist/chunk-SHYNXDRO.mjs.map +1 -0
  20. package/dist/{chunk-2EM4ATKI.mjs → chunk-SZJB5FLZ.mjs} +2 -2
  21. package/dist/{chunk-2EM4ATKI.mjs.map → chunk-SZJB5FLZ.mjs.map} +1 -1
  22. package/dist/{chunk-QHGGV4KJ.mjs → chunk-US4TG745.mjs} +6 -6
  23. package/dist/index.d.mts +94 -3
  24. package/dist/index.d.ts +94 -3
  25. package/dist/index.js +191 -130
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +21 -20
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/management/management.js +162 -120
  30. package/dist/management/management.js.map +1 -1
  31. package/dist/management/management.mjs +9 -10
  32. package/dist/{memoryUtils-2FVXDSS6.mjs → memoryUtils-HGCYEUCD.mjs} +1 -3
  33. package/dist/{memoryUtils-2FVXDSS6.mjs.map → memoryUtils-HGCYEUCD.mjs.map} +1 -1
  34. package/dist/modals/chat-modal/chat-modal.js +149 -30
  35. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  36. package/dist/modals/chat-modal/chat-modal.mjs +5 -6
  37. package/dist/modelStore-TFNX4GEC.mjs +8 -0
  38. package/dist/{public-0EYmtpGD.d.mts → public-DJa4Db00.d.mts} +9 -0
  39. package/dist/{public-0EYmtpGD.d.ts → public-DJa4Db00.d.ts} +9 -0
  40. package/dist/public-types.d.mts +1 -1
  41. package/dist/public-types.d.ts +1 -1
  42. package/dist/shared/custom-element.mjs +0 -1
  43. package/docs/03_provider_integration.md +5 -2
  44. package/package.json +1 -1
  45. package/dist/aiProviderStore-M4BVEKUB.mjs +0 -9
  46. package/dist/chat-EMKHB23B.mjs +0 -16
  47. package/dist/chunk-BJTO5JO5.mjs +0 -11
  48. package/dist/chunk-J6LSSK3G.mjs.map +0 -1
  49. package/dist/chunk-LKGBO5OP.mjs.map +0 -1
  50. package/dist/chunk-WSUUW7T2.mjs.map +0 -1
  51. package/dist/modelStore-7YYELPF6.mjs +0 -9
  52. package/dist/modelStore-7YYELPF6.mjs.map +0 -1
  53. /package/dist/{aiProviderStore-M4BVEKUB.mjs.map → aiProviderStore-HY5G4QAK.mjs.map} +0 -0
  54. /package/dist/{chat-EMKHB23B.mjs.map → chat-6N5B7A7F.mjs.map} +0 -0
  55. /package/dist/{chunk-ASWUEAWM.mjs.map → chunk-5BZWJQ5O.mjs.map} +0 -0
  56. /package/dist/{chunk-NGGTQVGX.mjs.map → chunk-E5WMDLE3.mjs.map} +0 -0
  57. /package/dist/{chunk-RLW4RBIR.mjs.map → chunk-KDIL5WUL.mjs.map} +0 -0
  58. /package/dist/{chunk-6VDL4SLX.mjs.map → chunk-N4BQ6HKL.mjs.map} +0 -0
  59. /package/dist/{chunk-RNCASZ2Y.mjs.map → chunk-PK3LFBGC.mjs.map} +0 -0
  60. /package/dist/{chunk-QHGGV4KJ.mjs.map → chunk-US4TG745.mjs.map} +0 -0
  61. /package/dist/{chunk-BJTO5JO5.mjs.map → modelStore-TFNX4GEC.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  IS_STORE_BUILD,
3
3
  chat_default
4
- } from "./chunk-WSUUW7T2.mjs";
4
+ } from "./chunk-SHYNXDRO.mjs";
5
5
  import {
6
6
  chat_provider_default
7
- } from "./chunk-QHGGV4KJ.mjs";
7
+ } from "./chunk-US4TG745.mjs";
8
8
  import "./chunk-ONQMRE2G.mjs";
9
9
  import {
10
10
  MANAGEMENT_SECTIONS,
@@ -15,17 +15,17 @@ import {
15
15
  useGatewayMemory,
16
16
  useGatewayModels,
17
17
  useManagementAccess
18
- } from "./chunk-RNCASZ2Y.mjs";
19
- import "./chunk-ASWUEAWM.mjs";
20
- import "./chunk-LKGBO5OP.mjs";
21
- import "./chunk-NGGTQVGX.mjs";
18
+ } from "./chunk-PK3LFBGC.mjs";
19
+ import "./chunk-5BZWJQ5O.mjs";
20
+ import "./chunk-CABOLDNR.mjs";
21
+ import "./chunk-E5WMDLE3.mjs";
22
22
  import {
23
23
  defineCustomElement
24
24
  } from "./chunk-P4C5IRM5.mjs";
25
25
  import {
26
26
  FeedbackButton,
27
27
  chat_modal_default
28
- } from "./chunk-6VDL4SLX.mjs";
28
+ } from "./chunk-N4BQ6HKL.mjs";
29
29
  import {
30
30
  FeedbackModal,
31
31
  StreamingTTSClient,
@@ -42,7 +42,7 @@ import {
42
42
  useTTS,
43
43
  useVoiceStore,
44
44
  voiceService
45
- } from "./chunk-RLW4RBIR.mjs";
45
+ } from "./chunk-KDIL5WUL.mjs";
46
46
  import {
47
47
  DEFAULT_TIER_FEATURES,
48
48
  FeatureFlagContext,
@@ -61,20 +61,21 @@ import {
61
61
  useVectorStore,
62
62
  vectorDatabaseService,
63
63
  vectorMigrationService
64
- } from "./chunk-FEIDGXVR.mjs";
64
+ } from "./chunk-46OGYEME.mjs";
65
65
  import {
66
66
  usePackageSettingsStore,
67
67
  usePreferencesStore
68
- } from "./chunk-2EM4ATKI.mjs";
68
+ } from "./chunk-SZJB5FLZ.mjs";
69
69
  import {
70
+ AUTH_TOKEN_CHANGED_EVENT,
71
+ TOKEN_KEY,
70
72
  authenticationService,
71
73
  useAuthenticationStore
72
- } from "./chunk-J6LSSK3G.mjs";
74
+ } from "./chunk-GRPTCHFN.mjs";
73
75
  import {
74
76
  DebugLogger,
75
77
  debugLogger
76
78
  } from "./chunk-HNXPDIWC.mjs";
77
- import "./chunk-BJTO5JO5.mjs";
78
79
 
79
80
  // src/management/components/InterestsEditor.tsx
80
81
  import { useEffect } from "react";
@@ -414,7 +415,7 @@ var SubscriptionExpiredModal = ({
414
415
  "Account: ",
415
416
  /* @__PURE__ */ jsx2("strong", { children: userEmail })
416
417
  ] }),
417
- /* @__PURE__ */ jsx2(Typography2, { variant: "body1", sx: { textAlign: "center", color: "text.secondary" }, children: IS_STORE_BUILD ? "Premium features are unavailable on this account right now." : "To continue using all features, please renew your subscription or return to the main application." }),
418
+ /* @__PURE__ */ jsx2(Typography2, { variant: "body1", sx: { textAlign: "center", color: "text.secondary" }, children: IS_STORE_BUILD ? "Premium features are unavailable on this account right now. You can subscribe to Pro in the app or review your account." : "To continue using all features, please renew your subscription or return to the main application." }),
418
419
  /* @__PURE__ */ jsx2(Box2, { sx: {
419
420
  bgcolor: "background.paper",
420
421
  border: 1,
@@ -436,10 +437,10 @@ var SubscriptionExpiredModal = ({
436
437
  startIcon: /* @__PURE__ */ jsx2(HomeIcon, {}),
437
438
  size: "large",
438
439
  sx: { minWidth: 140 },
439
- children: "Go Home"
440
+ children: IS_STORE_BUILD ? "My Account" : "Go Home"
440
441
  }
441
442
  ),
442
- !IS_STORE_BUILD && /* @__PURE__ */ jsx2(
443
+ (!IS_STORE_BUILD || onManageSubscription) && /* @__PURE__ */ jsx2(
443
444
  Button,
444
445
  {
445
446
  onClick: handleManageSubscription,
@@ -448,7 +449,7 @@ var SubscriptionExpiredModal = ({
448
449
  size: "large",
449
450
  color: "primary",
450
451
  sx: { minWidth: 140 },
451
- children: "Renew Subscription"
452
+ children: IS_STORE_BUILD ? "View Pro Options" : "Renew Subscription"
452
453
  }
453
454
  )
454
455
  ] })
@@ -486,11 +487,9 @@ var SubscriptionExpiredGuard = ({
486
487
  const evaluation = getFullEvaluation();
487
488
  const extractedEmail = userEmail || evaluation?.metadata?.jwtFound ? (() => {
488
489
  try {
489
- const token = localStorage.getItem("authToken");
490
+ const token = authenticationService.getToken();
490
491
  if (token) {
491
- const parts = token.split(".");
492
- const payload = JSON.parse(atob(parts[1]));
493
- return payload.email;
492
+ return authenticationService.parseJwtClaims(token)?.email;
494
493
  }
495
494
  } catch (e) {
496
495
  }
@@ -654,6 +653,7 @@ function getCriticalConfig() {
654
653
  };
655
654
  }
656
655
  export {
656
+ AUTH_TOKEN_CHANGED_EVENT,
657
657
  chat_default as Chat,
658
658
  chat_modal_default as ChatModal,
659
659
  chat_provider_default as ChatProvider,
@@ -674,6 +674,7 @@ export {
674
674
  StreamingTTSClient,
675
675
  SubscriptionExpiredGuard,
676
676
  SubscriptionExpiredModal,
677
+ TOKEN_KEY,
677
678
  TTSState,
678
679
  VectorDatabaseService,
679
680
  VectorMigrationService,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/management/components/InterestsEditor.tsx","../src/services/featureFlag/featureFlagService.ts","../src/hooks/useVoices.ts","../src/modals/SubscriptionExpiredModal.tsx","../src/guards/SubscriptionExpiredGuard.tsx","../src/services/http/httpErrorHandler.ts","../src/core/license-validator.ts","../src/core/system-constants.ts","../src/utils/critical-helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\nimport { useEffect } from \"react\";\nimport { Box, Chip, Typography } from \"@mui/material\";\nimport { usePreferencesStore } from \"../../store/preferencesStore\";\nimport { TOPICS as STARTER_TOPICS } from \"../../prompts/getStableQuestionPrompt\";\n\nexport interface InterestsEditorProps {\n title?: string | null;\n description?: string | null;\n}\n\n/**\n * Topic picker for the user's interests. Self-contained — hydrates the\n * preferences store on mount so it works anywhere (e.g. the account profile\n * page, outside the chat). Edits persist to the same store the home-screen\n * conversation starters read from.\n */\nconst InterestsEditor = ({\n title = \"Your interests\",\n description = \"Pick the topics you care about — your home-screen conversation starters lean toward them.\",\n}: InterestsEditorProps) => {\n const preferences = usePreferencesStore((s) => s.preferences);\n const updatePreference = usePreferencesStore((s) => s.updatePreference);\n const loadPreferences = usePreferencesStore((s) => s.loadPreferences);\n const isLoaded = usePreferencesStore((s) => s.isLoaded);\n\n useEffect(() => {\n if (!isLoaded) {\n void loadPreferences();\n }\n }, [isLoaded, loadPreferences]);\n\n const interests = preferences?.interests ?? [];\n\n return (\n <Box>\n {title && (\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n {description}\n </Typography>\n )}\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {STARTER_TOPICS.map((topic) => {\n const selected = interests.includes(topic);\n return (\n <Chip\n key={topic}\n label={topic}\n size=\"small\"\n color={selected ? \"primary\" : \"default\"}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={() => {\n const next = selected\n ? interests.filter((t) => t !== topic)\n : [...interests, topic];\n updatePreference(\"interests\", next);\n }}\n sx={{ textTransform: \"capitalize\" }}\n />\n );\n })}\n </Box>\n </Box>\n );\n};\n\nexport default InterestsEditor;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { SubscriptionTier, FeatureKey, DEFAULT_TIER_FEATURES } from '../../types/featureFlags';\nimport { debugLogger } from '../logging/debugLogger';\n\n/**\n * Service for managing subscription tiers and feature flags\n */\nexport class FeatureFlagService {\n private static instance: FeatureFlagService;\n private subscribers: Set<() => void> = new Set();\n\n static getInstance(): FeatureFlagService {\n if (!FeatureFlagService.instance) {\n FeatureFlagService.instance = new FeatureFlagService();\n }\n return FeatureFlagService.instance;\n }\n\n /**\n * Subscribe to subscription tier changes\n */\n subscribe(callback: () => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n /**\n * Notify all subscribers of changes\n */\n private notifySubscribers(): void {\n this.subscribers.forEach(callback => {\n try {\n callback();\n } catch (error) {\n debugLogger.error('Error in feature flag subscriber:', { error });\n }\n });\n }\n\n /**\n * Update subscription tier and notify components\n */\n updateSubscriptionTier(tier: SubscriptionTier): void {\n debugLogger.info('Updating subscription tier:', { tier });\n \n // Trigger feature evaluation refresh through custom event\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('bandit:tier-updated', { \n detail: { tier } \n }));\n }\n \n this.notifySubscribers();\n }\n\n /**\n * Sync subscription with external service\n */\n async syncWithExternalService(userId: string, apiUrl?: string): Promise<SubscriptionTier> {\n try {\n if (!apiUrl) {\n debugLogger.warn('No API URL provided for subscription sync');\n return 'basic';\n }\n\n const response = await fetch(`${apiUrl}/subscription/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${localStorage.getItem('bandit-jwt') || ''}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n const tier = data.tier as SubscriptionTier;\n\n debugLogger.info('Synced subscription from external service:', { tier });\n this.updateSubscriptionTier(tier);\n \n return tier;\n } catch (error) {\n debugLogger.error('Failed to sync subscription with external service:', { error });\n return 'basic'; // Fallback to basic tier\n }\n }\n\n /**\n * Get features available for a specific tier\n */\n getFeaturesForTier(tier: SubscriptionTier): Partial<Record<FeatureKey, boolean>> {\n return DEFAULT_TIER_FEATURES[tier] || {};\n }\n\n /**\n * Check if a tier includes a specific feature\n */\n tierHasFeature(tier: SubscriptionTier, feature: FeatureKey): boolean {\n const features = this.getFeaturesForTier(tier);\n return features[feature] ?? false;\n }\n\n /**\n * Get the minimum tier required for a feature\n */\n getMinimumTierForFeature(feature: FeatureKey): SubscriptionTier | null {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team'];\n \n for (const tier of tiers) {\n if (this.tierHasFeature(tier, feature)) {\n return tier;\n }\n }\n \n return null;\n }\n\n /**\n * Compare tier levels\n */\n compareTiers(tier1: SubscriptionTier, tier2: SubscriptionTier): number {\n const tierOrder: Record<SubscriptionTier, number> = {\n expired: 0, // Expired is lowest level\n basic: 1,\n premium: 2,\n pro: 3,\n team: 4,\n trial: 3 // Trial has same level as pro\n };\n\n return tierOrder[tier1] - tierOrder[tier2];\n }\n\n /**\n * Check if tier1 is higher than or equal to tier2\n */\n tierMeetsRequirement(userTier: SubscriptionTier, requiredTier: SubscriptionTier): boolean {\n return this.compareTiers(userTier, requiredTier) >= 0;\n }\n\n /**\n * Get upgrade path from current tier to target tier\n */\n getUpgradePath(currentTier: SubscriptionTier, targetTier: SubscriptionTier): SubscriptionTier[] {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team'];\n const currentIndex = tiers.indexOf(currentTier);\n const targetIndex = tiers.indexOf(targetTier);\n\n if (currentIndex >= targetIndex) {\n return []; // No upgrade needed\n }\n\n return tiers.slice(currentIndex + 1, targetIndex + 1);\n }\n\n /**\n * Handle subscription upgrade/downgrade\n */\n async handleSubscriptionChange(\n newTier: SubscriptionTier, \n options?: {\n apiUrl?: string;\n userId?: string;\n notifyExternal?: boolean;\n }\n ): Promise<boolean> {\n try {\n debugLogger.info('Handling subscription change:', { newTier, options });\n\n // Update locally first\n this.updateSubscriptionTier(newTier);\n\n // Optionally notify external service\n if (options?.notifyExternal && options?.apiUrl && options?.userId) {\n await fetch(`${options.apiUrl}/subscription/${options.userId}`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${localStorage.getItem('bandit-jwt') || ''}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ tier: newTier })\n });\n }\n\n return true;\n } catch (error) {\n debugLogger.error('Failed to handle subscription change:', { error });\n return false;\n }\n }\n\n /**\n * Preview features for a potential upgrade\n */\n previewUpgrade(targetTier: SubscriptionTier): {\n tier: SubscriptionTier;\n newFeatures: FeatureKey[];\n allFeatures: Partial<Record<FeatureKey, boolean>>;\n } {\n const features = this.getFeaturesForTier(targetTier);\n const newFeatures = Object.keys(features).filter(\n key => features[key as FeatureKey]\n ) as FeatureKey[];\n\n return {\n tier: targetTier,\n newFeatures,\n allFeatures: features\n };\n }\n\n /**\n * Generate feature comparison matrix\n */\n generateFeatureMatrix(): Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>> {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team', 'trial', 'expired'];\n const initialMatrix: Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>> = {\n basic: {},\n premium: {},\n pro: {},\n team: {},\n trial: {},\n expired: {}\n };\n\n return tiers.reduce<Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>>>((acc, tier) => {\n acc[tier] = this.getFeaturesForTier(tier);\n return acc;\n }, initialMatrix);\n }\n}\n\n/**\n * Singleton instance\n */\nexport const featureFlagService = FeatureFlagService.getInstance();\n\n/**\n * Convenience functions for external use\n */\nexport const updateSubscriptionTier = (tier: SubscriptionTier) => \n featureFlagService.updateSubscriptionTier(tier);\n\nexport const syncSubscriptionWithAPI = (userId: string, apiUrl?: string) => \n featureFlagService.syncWithExternalService(userId, apiUrl);\n\nexport const handleSubscriptionUpgrade = (\n newTier: SubscriptionTier, \n options?: Parameters<typeof featureFlagService.handleSubscriptionChange>[1]\n) => featureFlagService.handleSubscriptionChange(newTier, options);\n\nexport const previewTierUpgrade = (tier: SubscriptionTier) => \n featureFlagService.previewUpgrade(tier);\n\nexport const getFeatureMatrix = () => \n featureFlagService.generateFeatureMatrix();\n\nexport default featureFlagService;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { useEffect } from 'react';\nimport { useVoiceStore } from '../store/voiceStore';\nimport { usePackageSettingsStore } from '../store/packageSettingsStore';\nimport { useAuthenticationStore } from '../store/authenticationStore';\nimport { authenticationService } from '../services/auth/authenticationService';\nimport { debugLogger } from '../services/logging/debugLogger';\n\n/**\n * Hook to initialize and manage voice models from the gateway API\n * Automatically loads voices when gateway API URL is available\n */\nexport const useVoices = () => {\n const { \n availableVoices, \n selectedVoice, \n defaultVoice,\n fallbackVoice,\n isLoading,\n isServiceAvailable,\n setSelectedVoice, \n loadVoicesFromAPI, \n refreshVoices \n } = useVoiceStore();\n \n const gatewayApiUrl = usePackageSettingsStore(state => state.settings?.gatewayApiUrl);\n const { token } = useAuthenticationStore();\n\n // Auto-load voices when both gateway URL and JWT token are available\n useEffect(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n \n if (gatewayApiUrl && token && isAuthenticated && !isServiceAvailable) {\n debugLogger.debug('Gateway API URL and JWT token available, loading voice models...');\n loadVoicesFromAPI();\n } else if (gatewayApiUrl && !token) {\n debugLogger.debug('Gateway API URL available but no JWT token - skipping voice models load');\n } else if (gatewayApiUrl && token && !isAuthenticated) {\n debugLogger.debug('Gateway API URL available but JWT token is expired - skipping voice models load');\n }\n }, [gatewayApiUrl, token, loadVoicesFromAPI, isServiceAvailable]);\n\n return {\n // Voice data\n availableVoices,\n selectedVoice,\n defaultVoice,\n fallbackVoice,\n isLoading,\n isServiceAvailable,\n \n // Actions\n setSelectedVoice,\n refreshVoices,\n \n // Computed\n hasVoices: availableVoices.length > 0,\n isVoiceServiceConfigured: !!gatewayApiUrl,\n };\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { IS_STORE_BUILD } from \"../utils/storeBuild\";\nimport React from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n Button,\n Box,\n Alert,\n Stack\n} from '@mui/material';\nimport { AlertTriangle as WarningIcon, Home as HomeIcon, CreditCard as CreditCardIcon } from '@burtson-labs/icons/react';\n\nexport interface SubscriptionExpiredModalProps {\n open: boolean;\n onNavigateHome?: () => void;\n onManageSubscription?: () => void;\n onClose?: () => void;\n userEmail?: string;\n}\n\n/**\n * Modal shown when user has an expired subscription\n * Provides options to navigate home or manage subscription\n */\nexport const SubscriptionExpiredModal: React.FC<SubscriptionExpiredModalProps> = ({\n open,\n onNavigateHome,\n onManageSubscription,\n onClose,\n userEmail\n}) => {\n \n const handleNavigateHome = () => {\n if (onNavigateHome) {\n onNavigateHome();\n } else {\n // Default: try to navigate to parent app\n window.location.href = '/';\n }\n };\n\n const handleManageSubscription = () => {\n if (onManageSubscription) {\n onManageSubscription();\n } else {\n // Default: try to navigate to subscription management. The store build\n // has no renew action (below), so it carries no such link.\n if (!IS_STORE_BUILD) window.location.href = '/manage-subscription';\n }\n };\n\n return (\n <Dialog \n open={open} \n onClose={onClose}\n maxWidth=\"sm\" \n fullWidth\n disableEscapeKeyDown={!onClose}\n PaperProps={{\n sx: {\n borderRadius: 2,\n boxShadow: (theme) => theme.shadows[10]\n }\n }}\n >\n <DialogTitle sx={{ textAlign: 'center', pb: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1, mb: 1 }}>\n <WarningIcon size={32} color=\"warning\" />\n <Typography variant=\"h5\" component=\"span\" fontWeight=\"bold\">\n Subscription Expired\n </Typography>\n </Box>\n </DialogTitle>\n \n <DialogContent sx={{ pt: 1 }}>\n <Stack spacing={2}>\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n <Typography variant=\"body2\">\n Your subscription has expired and access to features has been restricted.\n </Typography>\n </Alert>\n \n {userEmail && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center' }}>\n Account: <strong>{userEmail}</strong>\n </Typography>\n )}\n \n <Typography variant=\"body1\" sx={{ textAlign: 'center', color: 'text.secondary' }}>\n {IS_STORE_BUILD\n ? 'Premium features are unavailable on this account right now.'\n : 'To continue using all features, please renew your subscription or return to the main application.'}\n </Typography>\n \n <Box sx={{ \n bgcolor: 'background.paper', \n border: 1, \n borderColor: 'divider', \n borderRadius: 1, \n p: 2, \n mt: 2 \n }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontStyle: 'italic' }}>\n <strong>What's affected:</strong> All premium features including document upload, voice controls, \n advanced search, and admin dashboard access have been disabled until your subscription is renewed.\n </Typography>\n </Box>\n </Stack>\n </DialogContent>\n \n <DialogActions sx={{ px: 3, pb: 3, gap: 1, justifyContent: 'center' }}>\n <Button\n onClick={handleNavigateHome}\n variant=\"outlined\"\n startIcon={<HomeIcon />}\n size=\"large\"\n sx={{ minWidth: 140 }}\n >\n Go Home\n </Button>\n \n {/* No renew / purchase action in the App Store / Play build (3.1.3(f)). */}\n {!IS_STORE_BUILD && (\n <Button\n onClick={handleManageSubscription}\n variant=\"contained\"\n startIcon={<CreditCardIcon />}\n size=\"large\"\n color=\"primary\"\n sx={{ minWidth: 140 }}\n >\n Renew Subscription\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default SubscriptionExpiredModal;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useState } from 'react';\nimport { useFeatures } from '../hooks/useFeatures';\nimport { SubscriptionExpiredModal } from '../modals/SubscriptionExpiredModal';\n\nexport interface SubscriptionExpiredGuardProps {\n children: React.ReactNode;\n onNavigateHome?: () => void;\n onManageSubscription?: () => void;\n userEmail?: string;\n /** If true, allows closing the modal and continues with limited access */\n allowContinue?: boolean;\n}\n\n/**\n * Guard component that shows subscription expired modal for expired users\n * Wraps children and shows modal when subscription is expired\n */\nexport const SubscriptionExpiredGuard: React.FC<SubscriptionExpiredGuardProps> = ({\n children,\n onNavigateHome,\n onManageSubscription,\n userEmail,\n allowContinue = false\n}) => {\n const { isExpiredTier, getFullEvaluation } = useFeatures();\n const [showModal, setShowModal] = useState(false);\n const [userDismissed, setUserDismissed] = useState(false);\n\n useEffect(() => {\n if (isExpiredTier() && !userDismissed) {\n setShowModal(true);\n } else {\n setShowModal(false);\n }\n }, [isExpiredTier, userDismissed]);\n\n const handleClose = () => {\n if (allowContinue) {\n setUserDismissed(true);\n setShowModal(false);\n }\n };\n\n const evaluation = getFullEvaluation();\n const extractedEmail = userEmail || evaluation?.metadata?.jwtFound \n ? (() => {\n try {\n const token = localStorage.getItem('authToken');\n if (token) {\n const parts = token.split('.');\n const payload = JSON.parse(atob(parts[1]));\n return payload.email;\n }\n } catch (e) {\n // Ignore errors\n }\n return undefined;\n })()\n : undefined;\n\n return (\n <>\n {children}\n <SubscriptionExpiredModal\n open={showModal}\n onNavigateHome={onNavigateHome}\n onManageSubscription={onManageSubscription}\n onClose={allowContinue ? handleClose : undefined}\n userEmail={extractedEmail}\n />\n </>\n );\n};\n\nexport default SubscriptionExpiredGuard;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { notificationService } from '../notification/notificationService';\nimport { debugLogger } from '../logging/debugLogger';\n\ntype ErrorRecord = Record<string, unknown>;\n\ninterface HttpErrorLike {\n response?: {\n status: number;\n data?: unknown;\n };\n config?: {\n url?: string;\n method?: string;\n };\n message?: string;\n code?: string;\n}\n\nconst isRecord = (value: unknown): value is ErrorRecord =>\n typeof value === 'object' && value !== null;\n\nconst isHttpErrorLike = (error: unknown): error is HttpErrorLike => isRecord(error);\n\nconst extractString = (record: ErrorRecord, key: string): string | undefined => {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n};\n\nconst normalizeMessages = (value: unknown): string[] => {\n if (!value) {\n return [];\n }\n\n if (typeof value === 'string') {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap(normalizeMessages);\n }\n\n if (isRecord(value) && typeof value.message === 'string') {\n return [value.message];\n }\n\n return [];\n};\n\n/**\n * Enhanced HTTP error handler that provides user-friendly notifications\n */\nexport const handleHttpError = (error: unknown, context?: string) => {\n const contextPrefix = context ? `[${context}] ` : '';\n \n if (isHttpErrorLike(error) && error.response) {\n const status = error.response.status;\n const data = error.response.data;\n const dataRecord = isRecord(data) ? data : {};\n \n // Extract detailed error information for logging\n const errorMessage =\n extractString(dataRecord, 'message') ||\n extractString(dataRecord, 'error') ||\n extractString(dataRecord, 'detail');\n const errorCode = extractString(dataRecord, 'code') || extractString(dataRecord, 'error_code');\n \n // Log the full error for debugging with structured data\n debugLogger.error(`${contextPrefix}HTTP Error ${status}:`, {\n status,\n url: error.config?.url,\n method: error.config?.method,\n errorMessage,\n errorCode,\n responseData: data,\n error\n });\n \n // Show user-friendly notification with detailed error info\n notificationService.handleHttpError(error, context ? `${context}: Request failed` : undefined);\n \n return {\n status,\n message: errorMessage || `HTTP ${status} Error`,\n code: errorCode,\n handled: true\n };\n }\n\n if (isHttpErrorLike(error) && (error.code === 'NETWORK_ERROR' || !error.response)) {\n debugLogger.error(`${contextPrefix}Network Error:`, { error });\n notificationService.handleNetworkError(error, context ? `${context}: Connection failed` : undefined);\n \n return {\n status: 0,\n message: 'Network Error',\n handled: true\n };\n }\n\n const fallbackMessage =\n (isHttpErrorLike(error) && error.message) ||\n (typeof error === 'string' ? error : 'Unknown error occurred');\n\n debugLogger.error(`${contextPrefix}Unknown Error:`, { error });\n notificationService.showError(\n context ? `${context}: ${fallbackMessage}` : fallbackMessage\n );\n\n return {\n status: -1,\n message: fallbackMessage,\n handled: true\n };\n};\n\n/**\n * Handle validation errors from API responses\n */\nexport const handleValidationError = (errors: unknown, context?: string) => {\n const contextPrefix = context ? `${context}: ` : '';\n \n if (Array.isArray(errors)) {\n const messages = errors.flatMap(normalizeMessages);\n if (messages.length > 0) {\n notificationService.handleValidationError(messages, `${contextPrefix}Please check your input`);\n return;\n }\n } else if (isRecord(errors)) {\n const collected: string[] = [];\n Object.values(errors).forEach((value) => {\n collected.push(...normalizeMessages(value));\n });\n\n if (collected.length > 0) {\n notificationService.handleValidationError(collected, `${contextPrefix}Please check your input`);\n return;\n }\n } else if (typeof errors === 'string') {\n notificationService.handleValidationError(errors, `${contextPrefix}Please check your input`);\n return;\n }\n\n notificationService.handleValidationError('Invalid input', `${contextPrefix}Please check your input`);\n};\n\n/**\n * Success notification helper\n */\nexport const showSuccessNotification = (message: string, context?: string) => {\n const fullMessage = context ? `${context}: ${message}` : message;\n notificationService.showSuccess(fullMessage);\n debugLogger.info(`Success: ${fullMessage}`);\n};\n\n/**\n * Info notification helper\n */\nexport const showInfoNotification = (message: string, context?: string) => {\n const fullMessage = context ? `${context}: ${message}` : message;\n notificationService.showInfo(fullMessage);\n debugLogger.info(`Info: ${fullMessage}`);\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n/** @deprecated Compatibility marker only; not a security or license check. */\nexport const SYSTEM_INTEGRITY_CHECK = '© 2025 Burtson Labs - Core License Validator';\n\n/** @deprecated Always returns true. Does not validate integrity, licensing, or trust. */\nexport function validateSystemIntegrity(): boolean {\n return true;\n}\n\n/** @deprecated Public compatibility constant. Not a credential or authorization token. */\nexport const CORE_SYSTEM_TOKEN = 'BL-SYSTEM-1751692562421';\n\n/** @deprecated Returns the legacy compatibility constant without side effects. */\nexport function initializeCoreSystem() {\n return CORE_SYSTEM_TOKEN;\n}\n\nexport default {\n validateSystemIntegrity,\n initializeCoreSystem,\n CORE_SYSTEM_TOKEN,\n SYSTEM_INTEGRITY_CHECK\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\n/** @deprecated Legacy compatibility metadata; none of these values validates a license or system. */\nexport const SYSTEM_VERSION = '1.1.3-BL-LICENSED';\nexport const CORE_HASH = 'BL-' + '568D8C3C';\nexport const VALIDATION_KEY = 'BURTSON-LABS-2025';\n\n/** @deprecated Static compatibility strings, not credentials. */\nexport const REQUIRED_TOKENS = [\n 'BL-SYSTEM-INIT',\n 'BANDIT-CORE-LICENSED', \n 'BURTSON-VALIDATION-OK'\n];\n\n/** @deprecated Historical metadata only. These flags do not control runtime behavior. */\nexport const SYSTEM_FLAGS = {\n LICENSED_MODE: true,\n VALIDATION_ENABLED: true,\n BURTSON_VERIFIED: true,\n LICENSE_CHECK: '© 2025 Burtson Labs'\n} as const;\n\n/** @deprecated Returns historical metadata without performing validation. */\nexport function getSystemConstants() {\n return {\n version: SYSTEM_VERSION,\n hash: CORE_HASH,\n validation: VALIDATION_KEY,\n flags: SYSTEM_FLAGS,\n license: '© 2025 Burtson Labs — Licensed under Business Source License 1.1'\n };\n}\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\n/** @deprecated Always returns false for compatibility; does not inspect the environment. */\nexport function validateEnvironment(): boolean {\n return false;\n}\n\n/** @deprecated Historical metadata only; not a security configuration. */\nexport function getCriticalConfig() {\n return {\n systemId: 'BANDIT-ENGINE-LICENSED',\n validation: '© 2025 Burtson Labs',\n required: true,\n timestamp: new Date().toISOString()\n };\n}\n\n/** @deprecated Returns the error unchanged. No license violation detection is performed. */\nexport function handleSystemError(error: Error) {\n return error;\n}\n\n/** @deprecated Historical metadata only. */\nexport const CRITICAL_CONSTANTS = {\n LICENSE_REQUIRED: true,\n BURTSON_VALIDATED: true,\n SYSTEM_PROTECTED: '© 2025 Burtson Labs'\n} as const;"],"mappings":"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","names":["useEffect","useEffect","Typography","Box","jsx","jsxs","useEffect","jsx","jsxs","useEffect"]}
1
+ {"version":3,"sources":["../src/management/components/InterestsEditor.tsx","../src/services/featureFlag/featureFlagService.ts","../src/hooks/useVoices.ts","../src/modals/SubscriptionExpiredModal.tsx","../src/guards/SubscriptionExpiredGuard.tsx","../src/services/http/httpErrorHandler.ts","../src/core/license-validator.ts","../src/core/system-constants.ts","../src/utils/critical-helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\nimport { useEffect } from \"react\";\nimport { Box, Chip, Typography } from \"@mui/material\";\nimport { usePreferencesStore } from \"../../store/preferencesStore\";\nimport { TOPICS as STARTER_TOPICS } from \"../../prompts/getStableQuestionPrompt\";\n\nexport interface InterestsEditorProps {\n title?: string | null;\n description?: string | null;\n}\n\n/**\n * Topic picker for the user's interests. Self-contained — hydrates the\n * preferences store on mount so it works anywhere (e.g. the account profile\n * page, outside the chat). Edits persist to the same store the home-screen\n * conversation starters read from.\n */\nconst InterestsEditor = ({\n title = \"Your interests\",\n description = \"Pick the topics you care about — your home-screen conversation starters lean toward them.\",\n}: InterestsEditorProps) => {\n const preferences = usePreferencesStore((s) => s.preferences);\n const updatePreference = usePreferencesStore((s) => s.updatePreference);\n const loadPreferences = usePreferencesStore((s) => s.loadPreferences);\n const isLoaded = usePreferencesStore((s) => s.isLoaded);\n\n useEffect(() => {\n if (!isLoaded) {\n void loadPreferences();\n }\n }, [isLoaded, loadPreferences]);\n\n const interests = preferences?.interests ?? [];\n\n return (\n <Box>\n {title && (\n <Typography variant=\"h6\" sx={{ fontWeight: 600, color: \"text.primary\" }}>\n {title}\n </Typography>\n )}\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n {description}\n </Typography>\n )}\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 1 }}>\n {STARTER_TOPICS.map((topic) => {\n const selected = interests.includes(topic);\n return (\n <Chip\n key={topic}\n label={topic}\n size=\"small\"\n color={selected ? \"primary\" : \"default\"}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={() => {\n const next = selected\n ? interests.filter((t) => t !== topic)\n : [...interests, topic];\n updatePreference(\"interests\", next);\n }}\n sx={{ textTransform: \"capitalize\" }}\n />\n );\n })}\n </Box>\n </Box>\n );\n};\n\nexport default InterestsEditor;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { SubscriptionTier, FeatureKey, DEFAULT_TIER_FEATURES } from '../../types/featureFlags';\nimport { debugLogger } from '../logging/debugLogger';\n\n/**\n * Service for managing subscription tiers and feature flags\n */\nexport class FeatureFlagService {\n private static instance: FeatureFlagService;\n private subscribers: Set<() => void> = new Set();\n\n static getInstance(): FeatureFlagService {\n if (!FeatureFlagService.instance) {\n FeatureFlagService.instance = new FeatureFlagService();\n }\n return FeatureFlagService.instance;\n }\n\n /**\n * Subscribe to subscription tier changes\n */\n subscribe(callback: () => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n /**\n * Notify all subscribers of changes\n */\n private notifySubscribers(): void {\n this.subscribers.forEach(callback => {\n try {\n callback();\n } catch (error) {\n debugLogger.error('Error in feature flag subscriber:', { error });\n }\n });\n }\n\n /**\n * Update subscription tier and notify components\n */\n updateSubscriptionTier(tier: SubscriptionTier): void {\n debugLogger.info('Updating subscription tier:', { tier });\n \n // Trigger feature evaluation refresh through custom event\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('bandit:tier-updated', { \n detail: { tier } \n }));\n }\n \n this.notifySubscribers();\n }\n\n /**\n * Sync subscription with external service\n */\n async syncWithExternalService(userId: string, apiUrl?: string): Promise<SubscriptionTier> {\n try {\n if (!apiUrl) {\n debugLogger.warn('No API URL provided for subscription sync');\n return 'basic';\n }\n\n const response = await fetch(`${apiUrl}/subscription/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${localStorage.getItem('bandit-jwt') || ''}`,\n 'Content-Type': 'application/json'\n }\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n const tier = data.tier as SubscriptionTier;\n\n debugLogger.info('Synced subscription from external service:', { tier });\n this.updateSubscriptionTier(tier);\n \n return tier;\n } catch (error) {\n debugLogger.error('Failed to sync subscription with external service:', { error });\n return 'basic'; // Fallback to basic tier\n }\n }\n\n /**\n * Get features available for a specific tier\n */\n getFeaturesForTier(tier: SubscriptionTier): Partial<Record<FeatureKey, boolean>> {\n return DEFAULT_TIER_FEATURES[tier] || {};\n }\n\n /**\n * Check if a tier includes a specific feature\n */\n tierHasFeature(tier: SubscriptionTier, feature: FeatureKey): boolean {\n const features = this.getFeaturesForTier(tier);\n return features[feature] ?? false;\n }\n\n /**\n * Get the minimum tier required for a feature\n */\n getMinimumTierForFeature(feature: FeatureKey): SubscriptionTier | null {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team'];\n \n for (const tier of tiers) {\n if (this.tierHasFeature(tier, feature)) {\n return tier;\n }\n }\n \n return null;\n }\n\n /**\n * Compare tier levels\n */\n compareTiers(tier1: SubscriptionTier, tier2: SubscriptionTier): number {\n const tierOrder: Record<SubscriptionTier, number> = {\n expired: 0, // Expired is lowest level\n basic: 1,\n premium: 2,\n pro: 3,\n team: 4,\n trial: 3 // Trial has same level as pro\n };\n\n return tierOrder[tier1] - tierOrder[tier2];\n }\n\n /**\n * Check if tier1 is higher than or equal to tier2\n */\n tierMeetsRequirement(userTier: SubscriptionTier, requiredTier: SubscriptionTier): boolean {\n return this.compareTiers(userTier, requiredTier) >= 0;\n }\n\n /**\n * Get upgrade path from current tier to target tier\n */\n getUpgradePath(currentTier: SubscriptionTier, targetTier: SubscriptionTier): SubscriptionTier[] {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team'];\n const currentIndex = tiers.indexOf(currentTier);\n const targetIndex = tiers.indexOf(targetTier);\n\n if (currentIndex >= targetIndex) {\n return []; // No upgrade needed\n }\n\n return tiers.slice(currentIndex + 1, targetIndex + 1);\n }\n\n /**\n * Handle subscription upgrade/downgrade\n */\n async handleSubscriptionChange(\n newTier: SubscriptionTier, \n options?: {\n apiUrl?: string;\n userId?: string;\n notifyExternal?: boolean;\n }\n ): Promise<boolean> {\n try {\n debugLogger.info('Handling subscription change:', { newTier, options });\n\n // Update locally first\n this.updateSubscriptionTier(newTier);\n\n // Optionally notify external service\n if (options?.notifyExternal && options?.apiUrl && options?.userId) {\n await fetch(`${options.apiUrl}/subscription/${options.userId}`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${localStorage.getItem('bandit-jwt') || ''}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ tier: newTier })\n });\n }\n\n return true;\n } catch (error) {\n debugLogger.error('Failed to handle subscription change:', { error });\n return false;\n }\n }\n\n /**\n * Preview features for a potential upgrade\n */\n previewUpgrade(targetTier: SubscriptionTier): {\n tier: SubscriptionTier;\n newFeatures: FeatureKey[];\n allFeatures: Partial<Record<FeatureKey, boolean>>;\n } {\n const features = this.getFeaturesForTier(targetTier);\n const newFeatures = Object.keys(features).filter(\n key => features[key as FeatureKey]\n ) as FeatureKey[];\n\n return {\n tier: targetTier,\n newFeatures,\n allFeatures: features\n };\n }\n\n /**\n * Generate feature comparison matrix\n */\n generateFeatureMatrix(): Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>> {\n const tiers: SubscriptionTier[] = ['basic', 'premium', 'pro', 'team', 'trial', 'expired'];\n const initialMatrix: Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>> = {\n basic: {},\n premium: {},\n pro: {},\n team: {},\n trial: {},\n expired: {}\n };\n\n return tiers.reduce<Record<SubscriptionTier, Partial<Record<FeatureKey, boolean>>>>((acc, tier) => {\n acc[tier] = this.getFeaturesForTier(tier);\n return acc;\n }, initialMatrix);\n }\n}\n\n/**\n * Singleton instance\n */\nexport const featureFlagService = FeatureFlagService.getInstance();\n\n/**\n * Convenience functions for external use\n */\nexport const updateSubscriptionTier = (tier: SubscriptionTier) => \n featureFlagService.updateSubscriptionTier(tier);\n\nexport const syncSubscriptionWithAPI = (userId: string, apiUrl?: string) => \n featureFlagService.syncWithExternalService(userId, apiUrl);\n\nexport const handleSubscriptionUpgrade = (\n newTier: SubscriptionTier, \n options?: Parameters<typeof featureFlagService.handleSubscriptionChange>[1]\n) => featureFlagService.handleSubscriptionChange(newTier, options);\n\nexport const previewTierUpgrade = (tier: SubscriptionTier) => \n featureFlagService.previewUpgrade(tier);\n\nexport const getFeatureMatrix = () => \n featureFlagService.generateFeatureMatrix();\n\nexport default featureFlagService;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { useEffect } from 'react';\nimport { useVoiceStore } from '../store/voiceStore';\nimport { usePackageSettingsStore } from '../store/packageSettingsStore';\nimport { useAuthenticationStore } from '../store/authenticationStore';\nimport { authenticationService } from '../services/auth/authenticationService';\nimport { debugLogger } from '../services/logging/debugLogger';\n\n/**\n * Hook to initialize and manage voice models from the gateway API\n * Automatically loads voices when gateway API URL is available\n */\nexport const useVoices = () => {\n const { \n availableVoices, \n selectedVoice, \n defaultVoice,\n fallbackVoice,\n isLoading,\n isServiceAvailable,\n setSelectedVoice, \n loadVoicesFromAPI, \n refreshVoices \n } = useVoiceStore();\n \n const gatewayApiUrl = usePackageSettingsStore(state => state.settings?.gatewayApiUrl);\n const { token } = useAuthenticationStore();\n\n // Auto-load voices when both gateway URL and JWT token are available\n useEffect(() => {\n const isAuthenticated = authenticationService.isAuthenticated();\n \n if (gatewayApiUrl && token && isAuthenticated && !isServiceAvailable) {\n debugLogger.debug('Gateway API URL and JWT token available, loading voice models...');\n loadVoicesFromAPI();\n } else if (gatewayApiUrl && !token) {\n debugLogger.debug('Gateway API URL available but no JWT token - skipping voice models load');\n } else if (gatewayApiUrl && token && !isAuthenticated) {\n debugLogger.debug('Gateway API URL available but JWT token is expired - skipping voice models load');\n }\n }, [gatewayApiUrl, token, loadVoicesFromAPI, isServiceAvailable]);\n\n return {\n // Voice data\n availableVoices,\n selectedVoice,\n defaultVoice,\n fallbackVoice,\n isLoading,\n isServiceAvailable,\n \n // Actions\n setSelectedVoice,\n refreshVoices,\n \n // Computed\n hasVoices: availableVoices.length > 0,\n isVoiceServiceConfigured: !!gatewayApiUrl,\n };\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { IS_STORE_BUILD } from \"../utils/storeBuild\";\nimport React from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n Button,\n Box,\n Alert,\n Stack\n} from '@mui/material';\nimport { AlertTriangle as WarningIcon, Home as HomeIcon, CreditCard as CreditCardIcon } from '@burtson-labs/icons/react';\n\nexport interface SubscriptionExpiredModalProps {\n open: boolean;\n onNavigateHome?: () => void;\n onManageSubscription?: () => void;\n onClose?: () => void;\n userEmail?: string;\n}\n\n/**\n * Modal shown when user has an expired subscription\n * Provides options to navigate home or manage subscription\n */\nexport const SubscriptionExpiredModal: React.FC<SubscriptionExpiredModalProps> = ({\n open,\n onNavigateHome,\n onManageSubscription,\n onClose,\n userEmail\n}) => {\n \n const handleNavigateHome = () => {\n if (onNavigateHome) {\n onNavigateHome();\n } else {\n // Default: try to navigate to parent app\n window.location.href = '/';\n }\n };\n\n const handleManageSubscription = () => {\n if (onManageSubscription) {\n onManageSubscription();\n } else {\n // Default: try to navigate to subscription management. The store build\n // has no renew action (below), so it carries no such link.\n if (!IS_STORE_BUILD) window.location.href = '/manage-subscription';\n }\n };\n\n return (\n <Dialog \n open={open} \n onClose={onClose}\n maxWidth=\"sm\" \n fullWidth\n disableEscapeKeyDown={!onClose}\n PaperProps={{\n sx: {\n borderRadius: 2,\n boxShadow: (theme) => theme.shadows[10]\n }\n }}\n >\n <DialogTitle sx={{ textAlign: 'center', pb: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 1, mb: 1 }}>\n <WarningIcon size={32} color=\"warning\" />\n <Typography variant=\"h5\" component=\"span\" fontWeight=\"bold\">\n Subscription Expired\n </Typography>\n </Box>\n </DialogTitle>\n \n <DialogContent sx={{ pt: 1 }}>\n <Stack spacing={2}>\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n <Typography variant=\"body2\">\n Your subscription has expired and access to features has been restricted.\n </Typography>\n </Alert>\n \n {userEmail && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ textAlign: 'center' }}>\n Account: <strong>{userEmail}</strong>\n </Typography>\n )}\n \n <Typography variant=\"body1\" sx={{ textAlign: 'center', color: 'text.secondary' }}>\n {IS_STORE_BUILD\n ? 'Premium features are unavailable on this account right now. You can subscribe to Pro in the app or review your account.'\n : 'To continue using all features, please renew your subscription or return to the main application.'}\n </Typography>\n \n <Box sx={{ \n bgcolor: 'background.paper', \n border: 1, \n borderColor: 'divider', \n borderRadius: 1, \n p: 2, \n mt: 2 \n }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontStyle: 'italic' }}>\n <strong>What's affected:</strong> All premium features including document upload, voice controls, \n advanced search, and admin dashboard access have been disabled until your subscription is renewed.\n </Typography>\n </Box>\n </Stack>\n </DialogContent>\n \n <DialogActions sx={{ px: 3, pb: 3, gap: 1, justifyContent: 'center' }}>\n <Button\n onClick={handleNavigateHome}\n variant=\"outlined\"\n startIcon={<HomeIcon />}\n size=\"large\"\n sx={{ minWidth: 140 }}\n >\n {IS_STORE_BUILD ? 'My Account' : 'Go Home'}\n </Button>\n \n {/* The App Store / Play build only offers the host's in-app store\n (Apple / Google billing), never a web renew link (3.1.3(f)). */}\n {(!IS_STORE_BUILD || onManageSubscription) && (\n <Button\n onClick={handleManageSubscription}\n variant=\"contained\"\n startIcon={<CreditCardIcon />}\n size=\"large\"\n color=\"primary\"\n sx={{ minWidth: 140 }}\n >\n {IS_STORE_BUILD ? 'View Pro Options' : 'Renew Subscription'}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default SubscriptionExpiredModal;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport React, { useEffect, useState } from 'react';\nimport { useFeatures } from '../hooks/useFeatures';\nimport { SubscriptionExpiredModal } from '../modals/SubscriptionExpiredModal';\nimport { authenticationService } from '../services/auth/authenticationService';\n\nexport interface SubscriptionExpiredGuardProps {\n children: React.ReactNode;\n onNavigateHome?: () => void;\n onManageSubscription?: () => void;\n userEmail?: string;\n /** If true, allows closing the modal and continues with limited access */\n allowContinue?: boolean;\n}\n\n/**\n * Guard component that shows subscription expired modal for expired users\n * Wraps children and shows modal when subscription is expired\n */\nexport const SubscriptionExpiredGuard: React.FC<SubscriptionExpiredGuardProps> = ({\n children,\n onNavigateHome,\n onManageSubscription,\n userEmail,\n allowContinue = false\n}) => {\n const { isExpiredTier, getFullEvaluation } = useFeatures();\n const [showModal, setShowModal] = useState(false);\n const [userDismissed, setUserDismissed] = useState(false);\n\n useEffect(() => {\n if (isExpiredTier() && !userDismissed) {\n setShowModal(true);\n } else {\n setShowModal(false);\n }\n }, [isExpiredTier, userDismissed]);\n\n const handleClose = () => {\n if (allowContinue) {\n setUserDismissed(true);\n setShowModal(false);\n }\n };\n\n const evaluation = getFullEvaluation();\n const extractedEmail = userEmail || evaluation?.metadata?.jwtFound\n ? (() => {\n try {\n const token = authenticationService.getToken();\n if (token) {\n return authenticationService.parseJwtClaims(token)?.email;\n }\n } catch (e) {\n // Ignore errors\n }\n return undefined;\n })()\n : undefined;\n\n return (\n <>\n {children}\n <SubscriptionExpiredModal\n open={showModal}\n onNavigateHome={onNavigateHome}\n onManageSubscription={onManageSubscription}\n onClose={allowContinue ? handleClose : undefined}\n userEmail={extractedEmail}\n />\n </>\n );\n};\n\nexport default SubscriptionExpiredGuard;\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\nimport { notificationService } from '../notification/notificationService';\nimport { debugLogger } from '../logging/debugLogger';\n\ntype ErrorRecord = Record<string, unknown>;\n\ninterface HttpErrorLike {\n response?: {\n status: number;\n data?: unknown;\n };\n config?: {\n url?: string;\n method?: string;\n };\n message?: string;\n code?: string;\n}\n\nconst isRecord = (value: unknown): value is ErrorRecord =>\n typeof value === 'object' && value !== null;\n\nconst isHttpErrorLike = (error: unknown): error is HttpErrorLike => isRecord(error);\n\nconst extractString = (record: ErrorRecord, key: string): string | undefined => {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n};\n\nconst normalizeMessages = (value: unknown): string[] => {\n if (!value) {\n return [];\n }\n\n if (typeof value === 'string') {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap(normalizeMessages);\n }\n\n if (isRecord(value) && typeof value.message === 'string') {\n return [value.message];\n }\n\n return [];\n};\n\n/**\n * Enhanced HTTP error handler that provides user-friendly notifications\n */\nexport const handleHttpError = (error: unknown, context?: string) => {\n const contextPrefix = context ? `[${context}] ` : '';\n \n if (isHttpErrorLike(error) && error.response) {\n const status = error.response.status;\n const data = error.response.data;\n const dataRecord = isRecord(data) ? data : {};\n \n // Extract detailed error information for logging\n const errorMessage =\n extractString(dataRecord, 'message') ||\n extractString(dataRecord, 'error') ||\n extractString(dataRecord, 'detail');\n const errorCode = extractString(dataRecord, 'code') || extractString(dataRecord, 'error_code');\n \n // Log the full error for debugging with structured data\n debugLogger.error(`${contextPrefix}HTTP Error ${status}:`, {\n status,\n url: error.config?.url,\n method: error.config?.method,\n errorMessage,\n errorCode,\n responseData: data,\n error\n });\n \n // Show user-friendly notification with detailed error info\n notificationService.handleHttpError(error, context ? `${context}: Request failed` : undefined);\n \n return {\n status,\n message: errorMessage || `HTTP ${status} Error`,\n code: errorCode,\n handled: true\n };\n }\n\n if (isHttpErrorLike(error) && (error.code === 'NETWORK_ERROR' || !error.response)) {\n debugLogger.error(`${contextPrefix}Network Error:`, { error });\n notificationService.handleNetworkError(error, context ? `${context}: Connection failed` : undefined);\n \n return {\n status: 0,\n message: 'Network Error',\n handled: true\n };\n }\n\n const fallbackMessage =\n (isHttpErrorLike(error) && error.message) ||\n (typeof error === 'string' ? error : 'Unknown error occurred');\n\n debugLogger.error(`${contextPrefix}Unknown Error:`, { error });\n notificationService.showError(\n context ? `${context}: ${fallbackMessage}` : fallbackMessage\n );\n\n return {\n status: -1,\n message: fallbackMessage,\n handled: true\n };\n};\n\n/**\n * Handle validation errors from API responses\n */\nexport const handleValidationError = (errors: unknown, context?: string) => {\n const contextPrefix = context ? `${context}: ` : '';\n \n if (Array.isArray(errors)) {\n const messages = errors.flatMap(normalizeMessages);\n if (messages.length > 0) {\n notificationService.handleValidationError(messages, `${contextPrefix}Please check your input`);\n return;\n }\n } else if (isRecord(errors)) {\n const collected: string[] = [];\n Object.values(errors).forEach((value) => {\n collected.push(...normalizeMessages(value));\n });\n\n if (collected.length > 0) {\n notificationService.handleValidationError(collected, `${contextPrefix}Please check your input`);\n return;\n }\n } else if (typeof errors === 'string') {\n notificationService.handleValidationError(errors, `${contextPrefix}Please check your input`);\n return;\n }\n\n notificationService.handleValidationError('Invalid input', `${contextPrefix}Please check your input`);\n};\n\n/**\n * Success notification helper\n */\nexport const showSuccessNotification = (message: string, context?: string) => {\n const fullMessage = context ? `${context}: ${message}` : message;\n notificationService.showSuccess(fullMessage);\n debugLogger.info(`Success: ${fullMessage}`);\n};\n\n/**\n * Info notification helper\n */\nexport const showInfoNotification = (message: string, context?: string) => {\n const fullMessage = context ? `${context}: ${message}` : message;\n notificationService.showInfo(fullMessage);\n debugLogger.info(`Info: ${fullMessage}`);\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n/** @deprecated Compatibility marker only; not a security or license check. */\nexport const SYSTEM_INTEGRITY_CHECK = '© 2025 Burtson Labs - Core License Validator';\n\n/** @deprecated Always returns true. Does not validate integrity, licensing, or trust. */\nexport function validateSystemIntegrity(): boolean {\n return true;\n}\n\n/** @deprecated Public compatibility constant. Not a credential or authorization token. */\nexport const CORE_SYSTEM_TOKEN = 'BL-SYSTEM-1751692562421';\n\n/** @deprecated Returns the legacy compatibility constant without side effects. */\nexport function initializeCoreSystem() {\n return CORE_SYSTEM_TOKEN;\n}\n\nexport default {\n validateSystemIntegrity,\n initializeCoreSystem,\n CORE_SYSTEM_TOKEN,\n SYSTEM_INTEGRITY_CHECK\n};\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\n/** @deprecated Legacy compatibility metadata; none of these values validates a license or system. */\nexport const SYSTEM_VERSION = '1.1.3-BL-LICENSED';\nexport const CORE_HASH = 'BL-' + '568D8C3C';\nexport const VALIDATION_KEY = 'BURTSON-LABS-2025';\n\n/** @deprecated Static compatibility strings, not credentials. */\nexport const REQUIRED_TOKENS = [\n 'BL-SYSTEM-INIT',\n 'BANDIT-CORE-LICENSED', \n 'BURTSON-VALIDATION-OK'\n];\n\n/** @deprecated Historical metadata only. These flags do not control runtime behavior. */\nexport const SYSTEM_FLAGS = {\n LICENSED_MODE: true,\n VALIDATION_ENABLED: true,\n BURTSON_VERIFIED: true,\n LICENSE_CHECK: '© 2025 Burtson Labs'\n} as const;\n\n/** @deprecated Returns historical metadata without performing validation. */\nexport function getSystemConstants() {\n return {\n version: SYSTEM_VERSION,\n hash: CORE_HASH,\n validation: VALIDATION_KEY,\n flags: SYSTEM_FLAGS,\n license: '© 2025 Burtson Labs — Licensed under Business Source License 1.1'\n };\n}\n","/*\n * Copyright (c) 2025 Burtson Labs LLC.\n * SPDX-License-Identifier: BUSL-1.1\n * See LICENSE for the applicable terms.\n */\n\n\n/** @deprecated Always returns false for compatibility; does not inspect the environment. */\nexport function validateEnvironment(): boolean {\n return false;\n}\n\n/** @deprecated Historical metadata only; not a security configuration. */\nexport function getCriticalConfig() {\n return {\n systemId: 'BANDIT-ENGINE-LICENSED',\n validation: '© 2025 Burtson Labs',\n required: true,\n timestamp: new Date().toISOString()\n };\n}\n\n/** @deprecated Returns the error unchanged. No license violation detection is performed. */\nexport function handleSystemError(error: Error) {\n return error;\n}\n\n/** @deprecated Historical metadata only. */\nexport const CRITICAL_CONSTANTS = {\n LICENSE_REQUIRED: true,\n BURTSON_VALIDATED: true,\n SYSTEM_PROTECTED: '© 2025 Burtson Labs'\n} as const;"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,iBAAiB;AAC1B,SAAS,KAAK,MAAM,kBAAkB;AAiClC,SAEI,KAFJ;AAlBJ,IAAM,kBAAkB,CAAC;AAAA,EACvB,QAAQ;AAAA,EACR,cAAc;AAChB,MAA4B;AAC1B,QAAM,cAAc,oBAAoB,CAAC,MAAM,EAAE,WAAW;AAC5D,QAAM,mBAAmB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB;AACtE,QAAM,kBAAkB,oBAAoB,CAAC,MAAM,EAAE,eAAe;AACpE,QAAM,WAAW,oBAAoB,CAAC,MAAM,EAAE,QAAQ;AAEtD,YAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,UAAU,eAAe,CAAC;AAE9B,QAAM,YAAY,aAAa,aAAa,CAAC;AAE7C,SACE,qBAAC,OACE;AAAA,aACC,oBAAC,cAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,KAAK,OAAO,eAAe,GACnE,iBACH;AAAA,IAED,eACC,oBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,IAAI,GAC9D,uBACH;AAAA,IAEF,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE,GAClD,iBAAe,IAAI,CAAC,UAAU;AAC7B,YAAM,WAAW,UAAU,SAAS,KAAK;AACzC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,UACP,MAAK;AAAA,UACL,OAAO,WAAW,YAAY;AAAA,UAC9B,SAAS,WAAW,WAAW;AAAA,UAC/B,SAAS,MAAM;AACb,kBAAM,OAAO,WACT,UAAU,OAAO,CAAC,MAAM,MAAM,KAAK,IACnC,CAAC,GAAG,WAAW,KAAK;AACxB,6BAAiB,aAAa,IAAI;AAAA,UACpC;AAAA,UACA,IAAI,EAAE,eAAe,aAAa;AAAA;AAAA,QAX7B;AAAA,MAYP;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEA,IAAO,0BAAQ;;;AC/DR,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EAC9B,OAAe;AAAA,EACP,cAA+B,oBAAI,IAAI;AAAA,EAE/C,OAAO,cAAkC;AACvC,QAAI,CAAC,oBAAmB,UAAU;AAChC,0BAAmB,WAAW,IAAI,oBAAmB;AAAA,IACvD;AACA,WAAO,oBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAAkC;AAC1C,SAAK,YAAY,IAAI,QAAQ;AAC7B,WAAO,MAAM,KAAK,YAAY,OAAO,QAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,SAAK,YAAY,QAAQ,cAAY;AACnC,UAAI;AACF,iBAAS;AAAA,MACX,SAAS,OAAO;AACd,oBAAY,MAAM,qCAAqC,EAAE,MAAM,CAAC;AAAA,MAClE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,MAA8B;AACnD,gBAAY,KAAK,+BAA+B,EAAE,KAAK,CAAC;AAGxD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,cAAc,IAAI,YAAY,uBAAuB;AAAA,QAC1D,QAAQ,EAAE,KAAK;AAAA,MACjB,CAAC,CAAC;AAAA,IACJ;AAEA,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,QAAgB,QAA4C;AACxF,QAAI;AACF,UAAI,CAAC,QAAQ;AACX,oBAAY,KAAK,2CAA2C;AAC5D,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,MAAM,IAAI;AAAA,QAC/D,SAAS;AAAA,UACP,iBAAiB,UAAU,aAAa,QAAQ,YAAY,KAAK,EAAE;AAAA,UACnE,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,MACnE;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,OAAO,KAAK;AAElB,kBAAY,KAAK,8CAA8C,EAAE,KAAK,CAAC;AACvE,WAAK,uBAAuB,IAAI;AAEhC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY,MAAM,sDAAsD,EAAE,MAAM,CAAC;AACjF,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,MAA8D;AAC/E,WAAO,sBAAsB,IAAI,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAwB,SAA8B;AACnE,UAAM,WAAW,KAAK,mBAAmB,IAAI;AAC7C,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,SAA8C;AACrE,UAAM,QAA4B,CAAC,SAAS,WAAW,OAAO,MAAM;AAEpE,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,eAAe,MAAM,OAAO,GAAG;AACtC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAyB,OAAiC;AACrE,UAAM,YAA8C;AAAA,MAClD,SAAS;AAAA;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,IACT;AAEA,WAAO,UAAU,KAAK,IAAI,UAAU,KAAK;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,UAA4B,cAAyC;AACxF,WAAO,KAAK,aAAa,UAAU,YAAY,KAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,aAA+B,YAAkD;AAC9F,UAAM,QAA4B,CAAC,SAAS,WAAW,OAAO,MAAM;AACpE,UAAM,eAAe,MAAM,QAAQ,WAAW;AAC9C,UAAM,cAAc,MAAM,QAAQ,UAAU;AAE5C,QAAI,gBAAgB,aAAa;AAC/B,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACJ,SACA,SAKkB;AAClB,QAAI;AACF,kBAAY,KAAK,iCAAiC,EAAE,SAAS,QAAQ,CAAC;AAGtE,WAAK,uBAAuB,OAAO;AAGnC,UAAI,SAAS,kBAAkB,SAAS,UAAU,SAAS,QAAQ;AACjE,cAAM,MAAM,GAAG,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,IAAI;AAAA,UAC9D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,iBAAiB,UAAU,aAAa,QAAQ,YAAY,KAAK,EAAE;AAAA,YACnE,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY,MAAM,yCAAyC,EAAE,MAAM,CAAC;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,YAIb;AACA,UAAM,WAAW,KAAK,mBAAmB,UAAU;AACnD,UAAM,cAAc,OAAO,KAAK,QAAQ,EAAE;AAAA,MACxC,SAAO,SAAS,GAAiB;AAAA,IACnC;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwF;AACtF,UAAM,QAA4B,CAAC,SAAS,WAAW,OAAO,QAAQ,SAAS,SAAS;AACxF,UAAM,gBAAgF;AAAA,MACpF,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,MACV,KAAK,CAAC;AAAA,MACN,MAAM,CAAC;AAAA,MACP,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,IACZ;AAEA,WAAO,MAAM,OAAuE,CAAC,KAAK,SAAS;AACjG,UAAI,IAAI,IAAI,KAAK,mBAAmB,IAAI;AACxC,aAAO;AAAA,IACT,GAAG,aAAa;AAAA,EAClB;AACF;AAKO,IAAM,qBAAqB,mBAAmB,YAAY;AAK1D,IAAM,yBAAyB,CAAC,SACrC,mBAAmB,uBAAuB,IAAI;AAEzC,IAAM,0BAA0B,CAAC,QAAgB,WACtD,mBAAmB,wBAAwB,QAAQ,MAAM;AAEpD,IAAM,4BAA4B,CACvC,SACA,YACG,mBAAmB,yBAAyB,SAAS,OAAO;AAE1D,IAAM,qBAAqB,CAAC,SACjC,mBAAmB,eAAe,IAAI;AAEjC,IAAM,mBAAmB,MAC9B,mBAAmB,sBAAsB;;;AChQ3C,SAAS,aAAAA,kBAAiB;AAWnB,IAAM,YAAY,MAAM;AAC7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,QAAM,gBAAgB,wBAAwB,WAAS,MAAM,UAAU,aAAa;AACpF,QAAM,EAAE,MAAM,IAAI,uBAAuB;AAGzC,EAAAC,WAAU,MAAM;AACd,UAAM,kBAAkB,sBAAsB,gBAAgB;AAE9D,QAAI,iBAAiB,SAAS,mBAAmB,CAAC,oBAAoB;AACpE,kBAAY,MAAM,kEAAkE;AACpF,wBAAkB;AAAA,IACpB,WAAW,iBAAiB,CAAC,OAAO;AAClC,kBAAY,MAAM,yEAAyE;AAAA,IAC7F,WAAW,iBAAiB,SAAS,CAAC,iBAAiB;AACrD,kBAAY,MAAM,iFAAiF;AAAA,IACrG;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,mBAAmB,kBAAkB,CAAC;AAEhE,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAGA,WAAW,gBAAgB,SAAS;AAAA,IACpC,0BAA0B,CAAC,CAAC;AAAA,EAC9B;AACF;;;ACxDA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,aAAa,QAAQ,UAAU,cAAc,sBAAsB;AAwDrF,SACE,OAAAC,MADF,QAAAC,aAAA;AA1CD,IAAM,2BAAoE,CAAC;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,qBAAqB,MAAM;AAC/B,QAAI,gBAAgB;AAClB,qBAAe;AAAA,IACjB,OAAO;AAEL,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,2BAA2B,MAAM;AACrC,QAAI,sBAAsB;AACxB,2BAAqB;AAAA,IACvB,OAAO;AAGL,UAAI,CAAC,eAAgB,QAAO,SAAS,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAS;AAAA,MACT,WAAS;AAAA,MACT,sBAAsB,CAAC;AAAA,MACvB,YAAY;AAAA,QACV,IAAI;AAAA,UACF,cAAc;AAAA,UACd,WAAW,CAAC,UAAU,MAAM,QAAQ,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAD,KAAC,eAAY,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,GAC5C,0BAAAC,MAACF,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,GAAG,IAAI,EAAE,GACxF;AAAA,0BAAAC,KAAC,eAAY,MAAM,IAAI,OAAM,WAAU;AAAA,UACvC,gBAAAA,KAACF,aAAA,EAAW,SAAQ,MAAK,WAAU,QAAO,YAAW,QAAO,kCAE5D;AAAA,WACF,GACF;AAAA,QAEA,gBAAAE,KAAC,iBAAc,IAAI,EAAE,IAAI,EAAE,GACzB,0BAAAC,MAAC,SAAM,SAAS,GACd;AAAA,0BAAAD,KAAC,SAAM,UAAS,WAAU,IAAI,EAAE,IAAI,EAAE,GACpC,0BAAAA,KAACF,aAAA,EAAW,SAAQ,SAAQ,uFAE5B,GACF;AAAA,UAEC,aACC,gBAAAG,MAACH,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,WAAW,SAAS,GAAG;AAAA;AAAA,YACrE,gBAAAE,KAAC,YAAQ,qBAAU;AAAA,aAC9B;AAAA,UAGF,gBAAAA,KAACF,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,WAAW,UAAU,OAAO,iBAAiB,GAC5E,2BACG,4HACA,qGACN;AAAA,UAEA,gBAAAE,KAACD,MAAA,EAAI,IAAI;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,cAAc;AAAA,YACd,GAAG;AAAA,YACH,IAAI;AAAA,UACN,GACE,0BAAAE,MAACH,aAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,WAAW,SAAS,GAC7E;AAAA,4BAAAE,KAAC,YAAO,8BAAgB;AAAA,YAAS;AAAA,aAEnC,GACF;AAAA,WACF,GACF;AAAA,QAEA,gBAAAC,MAAC,iBAAc,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,gBAAgB,SAAS,GAClE;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,SAAQ;AAAA,cACR,WAAW,gBAAAA,KAAC,YAAS;AAAA,cACrB,MAAK;AAAA,cACL,IAAI,EAAE,UAAU,IAAI;AAAA,cAEnB,2BAAiB,eAAe;AAAA;AAAA,UACnC;AAAA,WAIE,CAAC,kBAAkB,yBACrB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,SAAQ;AAAA,cACR,WAAW,gBAAAA,KAAC,kBAAe;AAAA,cAC3B,MAAK;AAAA,cACL,OAAM;AAAA,cACN,IAAI,EAAE,UAAU,IAAI;AAAA,cAEnB,2BAAiB,qBAAqB;AAAA;AAAA,UACzC;AAAA,WAEF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC7IA,SAAgB,aAAAE,YAAW,gBAAgB;AA4DvC,mBAEE,OAAAC,MAFF,QAAAC,aAAA;AA1CG,IAAM,2BAAoE,CAAC;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAM;AACJ,QAAM,EAAE,eAAe,kBAAkB,IAAI,YAAY;AACzD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AAExD,EAAAC,WAAU,MAAM;AACd,QAAI,cAAc,KAAK,CAAC,eAAe;AACrC,mBAAa,IAAI;AAAA,IACnB,OAAO;AACL,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,eAAe,aAAa,CAAC;AAEjC,QAAM,cAAc,MAAM;AACxB,QAAI,eAAe;AACjB,uBAAiB,IAAI;AACrB,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,kBAAkB;AACrC,QAAM,iBAAiB,aAAa,YAAY,UAAU,YACrD,MAAM;AACL,QAAI;AACF,YAAM,QAAQ,sBAAsB,SAAS;AAC7C,UAAI,OAAO;AACT,eAAO,sBAAsB,eAAe,KAAK,GAAG;AAAA,MACtD;AAAA,IACF,SAAS,GAAG;AAAA,IAEZ;AACA,WAAO;AAAA,EACT,GAAG,IACH;AAEJ,SACE,gBAAAD,MAAA,YACG;AAAA;AAAA,IACD,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,SAAS,gBAAgB,cAAc;AAAA,QACvC,WAAW;AAAA;AAAA,IACb;AAAA,KACF;AAEJ;;;ACrDA,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU;AAEzC,IAAM,kBAAkB,CAAC,UAA2C,SAAS,KAAK;AAElF,IAAM,gBAAgB,CAAC,QAAqB,QAAoC;AAC9E,QAAM,QAAQ,OAAO,GAAG;AACxB,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,IAAM,oBAAoB,CAAC,UAA6B;AACtD,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,QAAQ,iBAAiB;AAAA,EACxC;AAEA,MAAI,SAAS,KAAK,KAAK,OAAO,MAAM,YAAY,UAAU;AACxD,WAAO,CAAC,MAAM,OAAO;AAAA,EACvB;AAEA,SAAO,CAAC;AACV;AAKO,IAAM,kBAAkB,CAAC,OAAgB,YAAqB;AACnE,QAAM,gBAAgB,UAAU,IAAI,OAAO,OAAO;AAElD,MAAI,gBAAgB,KAAK,KAAK,MAAM,UAAU;AAC5C,UAAM,SAAS,MAAM,SAAS;AAC9B,UAAM,OAAO,MAAM,SAAS;AAC5B,UAAM,aAAa,SAAS,IAAI,IAAI,OAAO,CAAC;AAG5C,UAAM,eACJ,cAAc,YAAY,SAAS,KACnC,cAAc,YAAY,OAAO,KACjC,cAAc,YAAY,QAAQ;AACpC,UAAM,YAAY,cAAc,YAAY,MAAM,KAAK,cAAc,YAAY,YAAY;AAG7F,gBAAY,MAAM,GAAG,aAAa,cAAc,MAAM,KAAK;AAAA,MACzD;AAAA,MACA,KAAK,MAAM,QAAQ;AAAA,MACnB,QAAQ,MAAM,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAGD,wBAAoB,gBAAgB,OAAO,UAAU,GAAG,OAAO,qBAAqB,MAAS;AAE7F,WAAO;AAAA,MACL;AAAA,MACA,SAAS,gBAAgB,QAAQ,MAAM;AAAA,MACvC,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,gBAAgB,KAAK,MAAM,MAAM,SAAS,mBAAmB,CAAC,MAAM,WAAW;AACjF,gBAAY,MAAM,GAAG,aAAa,kBAAkB,EAAE,MAAM,CAAC;AAC7D,wBAAoB,mBAAmB,OAAO,UAAU,GAAG,OAAO,wBAAwB,MAAS;AAEnG,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBACH,gBAAgB,KAAK,KAAK,MAAM,YAChC,OAAO,UAAU,WAAW,QAAQ;AAEvC,cAAY,MAAM,GAAG,aAAa,kBAAkB,EAAE,MAAM,CAAC;AAC7D,sBAAoB;AAAA,IAClB,UAAU,GAAG,OAAO,KAAK,eAAe,KAAK;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAKO,IAAM,wBAAwB,CAAC,QAAiB,YAAqB;AAC1E,QAAM,gBAAgB,UAAU,GAAG,OAAO,OAAO;AAEjD,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,UAAM,WAAW,OAAO,QAAQ,iBAAiB;AACjD,QAAI,SAAS,SAAS,GAAG;AACvB,0BAAoB,sBAAsB,UAAU,GAAG,aAAa,yBAAyB;AAC7F;AAAA,IACF;AAAA,EACF,WAAW,SAAS,MAAM,GAAG;AAC3B,UAAM,YAAsB,CAAC;AAC7B,WAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,UAAU;AACvC,gBAAU,KAAK,GAAG,kBAAkB,KAAK,CAAC;AAAA,IAC5C,CAAC;AAED,QAAI,UAAU,SAAS,GAAG;AACxB,0BAAoB,sBAAsB,WAAW,GAAG,aAAa,yBAAyB;AAC9F;AAAA,IACF;AAAA,EACF,WAAW,OAAO,WAAW,UAAU;AACrC,wBAAoB,sBAAsB,QAAQ,GAAG,aAAa,yBAAyB;AAC3F;AAAA,EACF;AAEA,sBAAoB,sBAAsB,iBAAiB,GAAG,aAAa,yBAAyB;AACtG;AAKO,IAAM,0BAA0B,CAAC,SAAiB,YAAqB;AAC5E,QAAM,cAAc,UAAU,GAAG,OAAO,KAAK,OAAO,KAAK;AACzD,sBAAoB,YAAY,WAAW;AAC3C,cAAY,KAAK,YAAY,WAAW,EAAE;AAC5C;AAKO,IAAM,uBAAuB,CAAC,SAAiB,YAAqB;AACzE,QAAM,cAAc,UAAU,GAAG,OAAO,KAAK,OAAO,KAAK;AACzD,sBAAoB,SAAS,WAAW;AACxC,cAAY,KAAK,SAAS,WAAW,EAAE;AACzC;;;AC9JO,SAAS,0BAAmC;AACjD,SAAO;AACT;AAGO,IAAM,oBAAoB;AAG1B,SAAS,uBAAuB;AACrC,SAAO;AACT;;;ACZO,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,iBAAiB;AAUvB,IAAM,eAAe;AAAA,EAC1B,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,eAAe;AACjB;AAGO,SAAS,qBAAqB;AACnC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AACF;;;AC5BO,SAAS,sBAA+B;AAC7C,SAAO;AACT;AAGO,SAAS,oBAAoB;AAClC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;","names":["useEffect","useEffect","Typography","Box","jsx","jsxs","useEffect","jsx","jsxs","useEffect"]}