@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.
- package/README.md +4 -1
- package/dist/aiProviderStore-HY5G4QAK.mjs +8 -0
- package/dist/chat-6N5B7A7F.mjs +15 -0
- package/dist/chat-provider.js +175 -109
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +6 -7
- package/dist/{chunk-FEIDGXVR.mjs → chunk-46OGYEME.mjs} +24 -6
- package/dist/{chunk-FEIDGXVR.mjs.map → chunk-46OGYEME.mjs.map} +1 -1
- package/dist/{chunk-ASWUEAWM.mjs → chunk-5BZWJQ5O.mjs} +2 -2
- package/dist/{chunk-LKGBO5OP.mjs → chunk-CABOLDNR.mjs} +12 -84
- package/dist/chunk-CABOLDNR.mjs.map +1 -0
- package/dist/{chunk-NGGTQVGX.mjs → chunk-E5WMDLE3.mjs} +3 -3
- package/dist/{chunk-J6LSSK3G.mjs → chunk-GRPTCHFN.mjs} +149 -41
- package/dist/chunk-GRPTCHFN.mjs.map +1 -0
- package/dist/{chunk-RLW4RBIR.mjs → chunk-KDIL5WUL.mjs} +4 -4
- package/dist/{chunk-6VDL4SLX.mjs → chunk-N4BQ6HKL.mjs} +5 -5
- package/dist/{chunk-RNCASZ2Y.mjs → chunk-PK3LFBGC.mjs} +10 -10
- package/dist/{chunk-WSUUW7T2.mjs → chunk-SHYNXDRO.mjs} +10 -7
- package/dist/chunk-SHYNXDRO.mjs.map +1 -0
- package/dist/{chunk-2EM4ATKI.mjs → chunk-SZJB5FLZ.mjs} +2 -2
- package/dist/{chunk-2EM4ATKI.mjs.map → chunk-SZJB5FLZ.mjs.map} +1 -1
- package/dist/{chunk-QHGGV4KJ.mjs → chunk-US4TG745.mjs} +6 -6
- package/dist/index.d.mts +94 -3
- package/dist/index.d.ts +94 -3
- package/dist/index.js +191 -130
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -20
- package/dist/index.mjs.map +1 -1
- package/dist/management/management.js +162 -120
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +9 -10
- package/dist/{memoryUtils-2FVXDSS6.mjs → memoryUtils-HGCYEUCD.mjs} +1 -3
- package/dist/{memoryUtils-2FVXDSS6.mjs.map → memoryUtils-HGCYEUCD.mjs.map} +1 -1
- package/dist/modals/chat-modal/chat-modal.js +149 -30
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +5 -6
- package/dist/modelStore-TFNX4GEC.mjs +8 -0
- package/dist/{public-0EYmtpGD.d.mts → public-DJa4Db00.d.mts} +9 -0
- package/dist/{public-0EYmtpGD.d.ts → public-DJa4Db00.d.ts} +9 -0
- package/dist/public-types.d.mts +1 -1
- package/dist/public-types.d.ts +1 -1
- package/dist/shared/custom-element.mjs +0 -1
- package/docs/03_provider_integration.md +5 -2
- package/package.json +1 -1
- package/dist/aiProviderStore-M4BVEKUB.mjs +0 -9
- package/dist/chat-EMKHB23B.mjs +0 -16
- package/dist/chunk-BJTO5JO5.mjs +0 -11
- package/dist/chunk-J6LSSK3G.mjs.map +0 -1
- package/dist/chunk-LKGBO5OP.mjs.map +0 -1
- package/dist/chunk-WSUUW7T2.mjs.map +0 -1
- package/dist/modelStore-7YYELPF6.mjs +0 -9
- package/dist/modelStore-7YYELPF6.mjs.map +0 -1
- /package/dist/{aiProviderStore-M4BVEKUB.mjs.map → aiProviderStore-HY5G4QAK.mjs.map} +0 -0
- /package/dist/{chat-EMKHB23B.mjs.map → chat-6N5B7A7F.mjs.map} +0 -0
- /package/dist/{chunk-ASWUEAWM.mjs.map → chunk-5BZWJQ5O.mjs.map} +0 -0
- /package/dist/{chunk-NGGTQVGX.mjs.map → chunk-E5WMDLE3.mjs.map} +0 -0
- /package/dist/{chunk-RLW4RBIR.mjs.map → chunk-KDIL5WUL.mjs.map} +0 -0
- /package/dist/{chunk-6VDL4SLX.mjs.map → chunk-N4BQ6HKL.mjs.map} +0 -0
- /package/dist/{chunk-RNCASZ2Y.mjs.map → chunk-PK3LFBGC.mjs.map} +0 -0
- /package/dist/{chunk-QHGGV4KJ.mjs.map → chunk-US4TG745.mjs.map} +0 -0
- /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-
|
|
4
|
+
} from "./chunk-SHYNXDRO.mjs";
|
|
5
5
|
import {
|
|
6
6
|
chat_provider_default
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
64
|
+
} from "./chunk-46OGYEME.mjs";
|
|
65
65
|
import {
|
|
66
66
|
usePackageSettingsStore,
|
|
67
67
|
usePreferencesStore
|
|
68
|
-
} from "./chunk-
|
|
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-
|
|
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 =
|
|
490
|
+
const token = authenticationService.getToken();
|
|
490
491
|
if (token) {
|
|
491
|
-
|
|
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,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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"]}
|