@burtson-labs/bandit-engine 2.0.98 → 2.0.100
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/dist/{aiProviderStore-337QNQB3.mjs → aiProviderStore-FTD277QP.mjs} +2 -2
- package/dist/chat-PMO3WTM4.mjs +16 -0
- package/dist/chat-provider.js +152 -111
- package/dist/chat-provider.js.map +1 -1
- package/dist/chat-provider.mjs +5 -5
- package/dist/{chunk-J2PMXOV2.mjs → chunk-37JLV5PU.mjs} +18 -143
- package/dist/chunk-37JLV5PU.mjs.map +1 -0
- package/dist/{chunk-H3BYFEIE.mjs → chunk-43MLINPL.mjs} +157 -7
- package/dist/chunk-43MLINPL.mjs.map +1 -0
- package/dist/{chunk-L2EKYO4F.mjs → chunk-BN3D45E2.mjs} +4 -4
- package/dist/{chunk-USTEWR7Z.mjs → chunk-GGSK5RVZ.mjs} +12 -12
- package/dist/{chunk-ZLXWNTFK.mjs → chunk-HAUDGBUS.mjs} +3 -5
- package/dist/{chunk-ZLXWNTFK.mjs.map → chunk-HAUDGBUS.mjs.map} +1 -1
- package/dist/{chunk-RUMVTVNM.mjs → chunk-KYC7CC6C.mjs} +2 -2
- package/dist/{chunk-JOY64M5C.mjs → chunk-R3HBSHLE.mjs} +144 -98
- package/dist/chunk-R3HBSHLE.mjs.map +1 -0
- package/dist/{chunk-AGT77Z3A.mjs → chunk-RN3AKXKI.mjs} +4 -4
- package/dist/{chunk-IVLVUNIB.mjs → chunk-VIKZPBVO.mjs} +5 -5
- package/dist/{chunk-OSSZ7Z2O.mjs → chunk-VTKRZNLI.mjs} +8 -6
- package/dist/{chunk-OSSZ7Z2O.mjs.map → chunk-VTKRZNLI.mjs.map} +1 -1
- package/dist/index.js +157 -87
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -12
- package/dist/index.mjs.map +1 -1
- package/dist/management/management.js +303 -233
- package/dist/management/management.js.map +1 -1
- package/dist/management/management.mjs +8 -8
- package/dist/modals/chat-modal/chat-modal.js +161 -121
- package/dist/modals/chat-modal/chat-modal.js.map +1 -1
- package/dist/modals/chat-modal/chat-modal.mjs +4 -4
- package/package.json +1 -1
- package/dist/chat-HYXGXPJM.mjs +0 -16
- package/dist/chunk-H3BYFEIE.mjs.map +0 -1
- package/dist/chunk-J2PMXOV2.mjs.map +0 -1
- package/dist/chunk-JOY64M5C.mjs.map +0 -1
- /package/dist/{aiProviderStore-337QNQB3.mjs.map → aiProviderStore-FTD277QP.mjs.map} +0 -0
- /package/dist/{chat-HYXGXPJM.mjs.map → chat-PMO3WTM4.mjs.map} +0 -0
- /package/dist/{chunk-L2EKYO4F.mjs.map → chunk-BN3D45E2.mjs.map} +0 -0
- /package/dist/{chunk-USTEWR7Z.mjs.map → chunk-GGSK5RVZ.mjs.map} +0 -0
- /package/dist/{chunk-RUMVTVNM.mjs.map → chunk-KYC7CC6C.mjs.map} +0 -0
- /package/dist/{chunk-AGT77Z3A.mjs.map → chunk-RN3AKXKI.mjs.map} +0 -0
- /package/dist/{chunk-IVLVUNIB.mjs.map → chunk-VIKZPBVO.mjs.map} +0 -0
|
@@ -24,14 +24,14 @@ import {
|
|
|
24
24
|
useNotificationService,
|
|
25
25
|
useTTS,
|
|
26
26
|
useVoiceStore
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-VIKZPBVO.mjs";
|
|
28
28
|
import {
|
|
29
29
|
brandingService_default,
|
|
30
30
|
toTitleCase,
|
|
31
31
|
useAIQueryStore,
|
|
32
32
|
useConversationStore,
|
|
33
33
|
useMemoryStore
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-37JLV5PU.mjs";
|
|
35
35
|
import {
|
|
36
36
|
indexedDBService_default,
|
|
37
37
|
useModelStore,
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
} from "./chunk-LWHSOEPR.mjs";
|
|
41
41
|
import {
|
|
42
42
|
useAIProviderStore
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-43MLINPL.mjs";
|
|
44
44
|
import {
|
|
45
45
|
debugLogger
|
|
46
46
|
} from "./chunk-KCI46M23.mjs";
|
|
@@ -2803,4 +2803,4 @@ export {
|
|
|
2803
2803
|
MAX_WINDOWED_HEIGHT,
|
|
2804
2804
|
chat_modal_default
|
|
2805
2805
|
};
|
|
2806
|
-
//# sourceMappingURL=chunk-
|
|
2806
|
+
//# sourceMappingURL=chunk-RN3AKXKI.mjs.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
authenticationService,
|
|
3
2
|
notificationService,
|
|
4
3
|
useConversationStore,
|
|
5
4
|
useConversationSyncStore,
|
|
@@ -7,15 +6,16 @@ import {
|
|
|
7
6
|
useMemoryStore,
|
|
8
7
|
useNotification,
|
|
9
8
|
useVectorStore
|
|
10
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-37JLV5PU.mjs";
|
|
11
10
|
import {
|
|
12
11
|
useModelStore,
|
|
13
12
|
usePackageSettingsStore,
|
|
14
13
|
usePreferencesStore
|
|
15
14
|
} from "./chunk-LWHSOEPR.mjs";
|
|
16
15
|
import {
|
|
17
|
-
GatewayService
|
|
18
|
-
|
|
16
|
+
GatewayService,
|
|
17
|
+
authenticationService
|
|
18
|
+
} from "./chunk-43MLINPL.mjs";
|
|
19
19
|
import {
|
|
20
20
|
debugLogger
|
|
21
21
|
} from "./chunk-KCI46M23.mjs";
|
|
@@ -9043,4 +9043,4 @@ export {
|
|
|
9043
9043
|
FeedbackButton,
|
|
9044
9044
|
useNotificationService
|
|
9045
9045
|
};
|
|
9046
|
-
//# sourceMappingURL=chunk-
|
|
9046
|
+
//# sourceMappingURL=chunk-VIKZPBVO.mjs.map
|
|
@@ -3,15 +3,13 @@ import {
|
|
|
3
3
|
} from "./chunk-ONQMRE2G.mjs";
|
|
4
4
|
import {
|
|
5
5
|
aiProviderInitService
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HAUDGBUS.mjs";
|
|
7
7
|
import {
|
|
8
8
|
useMCPToolsStore
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-BN3D45E2.mjs";
|
|
10
10
|
import {
|
|
11
|
-
AUTH_TOKEN_CHANGED_EVENT,
|
|
12
11
|
FeatureFlagProvider,
|
|
13
12
|
NotificationProvider,
|
|
14
|
-
authenticationService,
|
|
15
13
|
brandingService_default,
|
|
16
14
|
embeddingService,
|
|
17
15
|
useAIQueryStore,
|
|
@@ -21,13 +19,17 @@ import {
|
|
|
21
19
|
useKnowledgeStore2,
|
|
22
20
|
useMemoryStore,
|
|
23
21
|
useProjectStore
|
|
24
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-37JLV5PU.mjs";
|
|
25
23
|
import {
|
|
26
24
|
indexedDBService_default,
|
|
27
25
|
useModelStore,
|
|
28
26
|
usePackageSettingsStore,
|
|
29
27
|
usePreferencesStore
|
|
30
28
|
} from "./chunk-LWHSOEPR.mjs";
|
|
29
|
+
import {
|
|
30
|
+
AUTH_TOKEN_CHANGED_EVENT,
|
|
31
|
+
authenticationService
|
|
32
|
+
} from "./chunk-43MLINPL.mjs";
|
|
31
33
|
import {
|
|
32
34
|
debugLogger
|
|
33
35
|
} from "./chunk-KCI46M23.mjs";
|
|
@@ -189,4 +191,4 @@ export {
|
|
|
189
191
|
ChatProvider,
|
|
190
192
|
chat_provider_default
|
|
191
193
|
};
|
|
192
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-VTKRZNLI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat-provider.tsx","../src/chat-provider.css"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9A05-FB9C98\nconst __banditFingerprint_chatprovidertsx = 'BL-FP-E60286-2996';\nconst __auditTrail_chatprovidertsx = 'BL-AU-MGOIKVV6-O6E4';\n// File: chat-provider.tsx | Path: src/chat-provider.tsx | Hash: 9a052996\n\nimport React, { useEffect, useState } from \"react\";\nimport { PackageSettings, usePackageSettingsStore } from \"./store/packageSettingsStore\";\nimport { AUTH_TOKEN_CHANGED_EVENT, authenticationService } from \"./services/auth/authenticationService\";\nimport { useConversationStore } from \"./store/conversationStore\";\nimport { useAIQueryStore } from \"./store/aiQueryStore\";\nimport { useMemoryStore } from \"./store/memoryStore\";\nimport { useModelStore } from \"./store/modelStore\";\nimport { usePreferencesStore } from \"./store/preferencesStore\";\nimport { useProjectStore } from \"./store/projectStore\";\nimport { useConversationSyncStore } from \"./store/conversationSyncStore\";\nimport { useKnowledgeStore } from \"./store/knowledgeStore\";\nimport { useMCPToolsStore } from \"./store/mcpToolsStore\";\nimport { useKnowledgeStore as useKnowledgeHook } from \"./chat/hooks/useKnowledgeStore\";\nimport { embeddingService } from \"./services/embedding/embeddingService\";\nimport { aiProviderInitService } from \"./services/ai-provider-init.service\";\nimport brandingService, { BrandingConfigPayload } from \"./services/branding/brandingService\";\nimport indexedDBService from \"./services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"./services/logging/debugLogger\";\nimport { NotificationProvider } from \"./shared/components/NotificationProvider\";\nimport { FeatureFlagProvider } from \"./contexts/FeatureFlagContext\";\nimport { FeatureFlagConfig } from \"./types/featureFlags\";\nimport \"./chat-provider.css\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { StoredBanditConfigRecord } from \"./types/config\";\n\nexport interface ChatConfig {\n packageSettings: PackageSettings;\n /** Feature flag configuration - can override packageSettings.featureFlags */\n featureFlags?: FeatureFlagConfig;\n children?: React.ReactNode;\n}\n\nexport const ChatProvider: React.FC<ChatConfig> = (props) => {\n const { loadDocuments } = useKnowledgeHook();\n const [queryClient] = useState(() => new QueryClient());\n\n // Determine final feature flag configuration\n const featureFlagConfig: FeatureFlagConfig = {\n ...props.packageSettings.featureFlags,\n ...props.featureFlags\n };\n\n useEffect(() => {\n const initializeAsync = async () => {\n // Set package settings first\n usePackageSettingsStore.setState(() => ({\n settings: props.packageSettings,\n }));\n\n // Initialize the new AI provider system early\n try {\n await aiProviderInitService.initializeFromSettings();\n } catch (error) {\n debugLogger.error(\"Failed to initialize AI provider:\", { error });\n }\n\n const token = authenticationService.getToken();\n if (token && !authenticationService.isTokenExpired(token)) {\n authenticationService.setToken(token);\n } else {\n authenticationService.clearToken();\n }\n\n useConversationStore.getState().hydrate();\n useProjectStore.getState().hydrate();\n useAIQueryStore.getState().hydrate();\n useMemoryStore.getState().hydrate();\n \n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode) {\n debugLogger.info(\"ChatProvider: Playground mode detected — skipping remote preference and sync initialization\");\n } else {\n // Load preferences, knowledge docs, and MCP tools\n await usePreferencesStore.getState().loadPreferences();\n await useKnowledgeStore.getState().loadDocs();\n await useMCPToolsStore.getState().loadTools();\n // Discover the user's connected MCP servers' tools in the background\n // (best-effort) so the model can call them without delaying chat startup.\n void useMCPToolsStore.getState().loadMcpServerTools();\n await useConversationSyncStore.getState().initialize();\n }\n \n // Initialize models after AI provider is set up\n debugLogger.info(\"ChatProvider about to call initModels - checking for existing branding first\");\n \n // Get existing branding before initModels to protect user-saved branding\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n let existingBranding: StoredBanditConfigRecord[\"branding\"] | null = null;\n try {\n const config = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (config?.branding?.userSaved) {\n existingBranding = config.branding;\n debugLogger.info(\"Found user-saved branding to protect during initModels\", {\n hasText: !!existingBranding.brandingText,\n hasLogo: !!existingBranding.logoBase64,\n theme: existingBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Could not check existing branding before initModels\", { error: err });\n }\n \n await useModelStore.getState().initModels().catch((err) => {\n debugLogger.error(\"❌ Failed to initialize models:\", { error: err });\n });\n \n // Restore user branding if it was overwritten\n if (existingBranding) {\n try {\n const afterInitModels = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (JSON.stringify(afterInitModels?.branding) !== JSON.stringify(existingBranding)) {\n debugLogger.warn(\"ChatProvider: initModels overwrote user branding! Restoring...\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...afterInitModels,\n id: \"main\",\n branding: existingBranding,\n }, storeConfigs);\n debugLogger.info(\"ChatProvider: User branding restored after initModels\");\n }\n } catch (err) {\n debugLogger.error(\"ChatProvider: Failed to restore branding after initModels\", { error: err });\n }\n }\n\n if (props.packageSettings.brandingConfigUrl) {\n fetch(props.packageSettings.brandingConfigUrl)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`HTTP error ${res.status}`);\n }\n return res.json();\n })\n .then((json: unknown) => {\n if (json && typeof json === \"object\") {\n brandingService.setBrandingFromConfig(json as BrandingConfigPayload);\n }\n })\n .catch((err) => {\n debugLogger.error(\"❌ Failed to fetch or apply branding config:\", { error: err });\n });\n }\n\n if (!isPlaygroundMode) {\n loadDocuments();\n embeddingService.backfillMissingEmbeddings().catch((err: unknown) => {\n debugLogger.error(\"❌ Failed to backfill memory embeddings:\", { error: err });\n });\n } else {\n debugLogger.info(\"ChatProvider: Playground mode skipping knowledge backfill\");\n }\n };\n\n initializeAsync();\n }, [props.packageSettings, loadDocuments]);\n\n useEffect(() => {\n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode || !props.packageSettings.gatewayApiUrl) {\n return;\n }\n\n const initializeSyncState = async () => {\n try {\n await useConversationSyncStore.getState().initialize();\n } catch (error) {\n debugLogger.error(\"ChatProvider: deferred sync initialization failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleAuthTokenChange = () => {\n void initializeSyncState();\n };\n\n window.addEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.addEventListener(\"pageshow\", handleAuthTokenChange);\n window.addEventListener(\"focus\", handleAuthTokenChange);\n\n return () => {\n window.removeEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.removeEventListener(\"pageshow\", handleAuthTokenChange);\n window.removeEventListener(\"focus\", handleAuthTokenChange);\n };\n }, [props.packageSettings.gatewayApiUrl, props.packageSettings.playgroundMode]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider config={featureFlagConfig}>\n <NotificationProvider>\n {props.children}\n </NotificationProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport default ChatProvider;\n","import styleInject from '#style-inject';styleInject(\"*,\\n*::before,\\n*::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n}\\n:root {\\n --vh: 1vh;\\n --input-offset: 1.5rem;\\n}\\nhtml {\\n height: 100%;\\n overflow: hidden;\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n}\\nhtml::-webkit-scrollbar {\\n display: none;\\n}\\nbody {\\n height: 100%;\\n overflow: auto;\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n}\\nbody::-webkit-scrollbar {\\n display: none;\\n}\\na {\\n color: inherit;\\n text-decoration: none;\\n}\\n.container {\\n max-width: 1200px;\\n margin: 0 auto;\\n padding: 2rem;\\n}\\n.mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mx-auto {\\n margin-left: auto;\\n margin-right: auto;\\n}\\n.bandit-logo-container {\\n display: flex;\\n height: 50vh;\\n margin: auto;\\n}\\n.bandit-logo {\\n margin: auto;\\n display: flex;\\n flex: 1 1 auto;\\n flex-direction: column;\\n align-items: center;\\n width: 90vw;\\n max-width: 640px;\\n height: 55vh;\\n background-size: cover;\\n background-position: center center;\\n background-repeat: no-repeat;\\n transition: opacity 0.6s ease-in-out, transform 0.6s ease-in-out;\\n}\\n.bandit-logo-hidden {\\n opacity: 0;\\n transform: translateY(-10px);\\n pointer-events: none;\\n}\\n.bandit-logo-visible {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n\")"],"mappings":"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","names":["useKnowledgeStore"]}
|
|
1
|
+
{"version":3,"sources":["../src/chat-provider.tsx","../src/chat-provider.css"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9A05-FB9C98\nconst __banditFingerprint_chatprovidertsx = 'BL-FP-E60286-2996';\nconst __auditTrail_chatprovidertsx = 'BL-AU-MGOIKVV6-O6E4';\n// File: chat-provider.tsx | Path: src/chat-provider.tsx | Hash: 9a052996\n\nimport React, { useEffect, useState } from \"react\";\nimport { PackageSettings, usePackageSettingsStore } from \"./store/packageSettingsStore\";\nimport { AUTH_TOKEN_CHANGED_EVENT, authenticationService } from \"./services/auth/authenticationService\";\nimport { useConversationStore } from \"./store/conversationStore\";\nimport { useAIQueryStore } from \"./store/aiQueryStore\";\nimport { useMemoryStore } from \"./store/memoryStore\";\nimport { useModelStore } from \"./store/modelStore\";\nimport { usePreferencesStore } from \"./store/preferencesStore\";\nimport { useProjectStore } from \"./store/projectStore\";\nimport { useConversationSyncStore } from \"./store/conversationSyncStore\";\nimport { useKnowledgeStore } from \"./store/knowledgeStore\";\nimport { useMCPToolsStore } from \"./store/mcpToolsStore\";\nimport { useKnowledgeStore as useKnowledgeHook } from \"./chat/hooks/useKnowledgeStore\";\nimport { embeddingService } from \"./services/embedding/embeddingService\";\nimport { aiProviderInitService } from \"./services/ai-provider-init.service\";\nimport brandingService, { BrandingConfigPayload } from \"./services/branding/brandingService\";\nimport indexedDBService from \"./services/indexedDB/indexedDBService\";\nimport { debugLogger } from \"./services/logging/debugLogger\";\nimport { NotificationProvider } from \"./shared/components/NotificationProvider\";\nimport { FeatureFlagProvider } from \"./contexts/FeatureFlagContext\";\nimport { FeatureFlagConfig } from \"./types/featureFlags\";\nimport \"./chat-provider.css\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { StoredBanditConfigRecord } from \"./types/config\";\n\nexport interface ChatConfig {\n packageSettings: PackageSettings;\n /** Feature flag configuration - can override packageSettings.featureFlags */\n featureFlags?: FeatureFlagConfig;\n children?: React.ReactNode;\n}\n\nexport const ChatProvider: React.FC<ChatConfig> = (props) => {\n const { loadDocuments } = useKnowledgeHook();\n const [queryClient] = useState(() => new QueryClient());\n\n // Determine final feature flag configuration\n const featureFlagConfig: FeatureFlagConfig = {\n ...props.packageSettings.featureFlags,\n ...props.featureFlags\n };\n\n useEffect(() => {\n const initializeAsync = async () => {\n // Set package settings first\n usePackageSettingsStore.setState(() => ({\n settings: props.packageSettings,\n }));\n\n // Initialize the new AI provider system early\n try {\n await aiProviderInitService.initializeFromSettings();\n } catch (error) {\n debugLogger.error(\"Failed to initialize AI provider:\", { error });\n }\n\n const token = authenticationService.getToken();\n if (token && !authenticationService.isTokenExpired(token)) {\n authenticationService.setToken(token);\n } else {\n authenticationService.clearToken();\n }\n\n useConversationStore.getState().hydrate();\n useProjectStore.getState().hydrate();\n useAIQueryStore.getState().hydrate();\n useMemoryStore.getState().hydrate();\n \n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode) {\n debugLogger.info(\"ChatProvider: Playground mode detected — skipping remote preference and sync initialization\");\n } else {\n // Load preferences, knowledge docs, and MCP tools\n await usePreferencesStore.getState().loadPreferences();\n await useKnowledgeStore.getState().loadDocs();\n await useMCPToolsStore.getState().loadTools();\n // Discover the user's connected MCP servers' tools in the background\n // (best-effort) so the model can call them without delaying chat startup.\n void useMCPToolsStore.getState().loadMcpServerTools();\n await useConversationSyncStore.getState().initialize();\n }\n \n // Initialize models after AI provider is set up\n debugLogger.info(\"ChatProvider about to call initModels - checking for existing branding first\");\n \n // Get existing branding before initModels to protect user-saved branding\n const storeConfigs = [{ name: \"config\", keyPath: \"id\" }] as const;\n let existingBranding: StoredBanditConfigRecord[\"branding\"] | null = null;\n try {\n const config = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (config?.branding?.userSaved) {\n existingBranding = config.branding;\n debugLogger.info(\"Found user-saved branding to protect during initModels\", {\n hasText: !!existingBranding.brandingText,\n hasLogo: !!existingBranding.logoBase64,\n theme: existingBranding.theme\n });\n }\n } catch (err) {\n debugLogger.warn(\"Could not check existing branding before initModels\", { error: err });\n }\n \n await useModelStore.getState().initModels().catch((err) => {\n debugLogger.error(\"❌ Failed to initialize models:\", { error: err });\n });\n \n // Restore user branding if it was overwritten\n if (existingBranding) {\n try {\n const afterInitModels = await indexedDBService.get<StoredBanditConfigRecord>(\n \"banditConfig\",\n 1,\n \"config\",\n \"main\",\n storeConfigs\n );\n if (JSON.stringify(afterInitModels?.branding) !== JSON.stringify(existingBranding)) {\n debugLogger.warn(\"ChatProvider: initModels overwrote user branding! Restoring...\");\n await indexedDBService.put<StoredBanditConfigRecord>(\"banditConfig\", 1, \"config\", {\n ...afterInitModels,\n id: \"main\",\n branding: existingBranding,\n }, storeConfigs);\n debugLogger.info(\"ChatProvider: User branding restored after initModels\");\n }\n } catch (err) {\n debugLogger.error(\"ChatProvider: Failed to restore branding after initModels\", { error: err });\n }\n }\n\n if (props.packageSettings.brandingConfigUrl) {\n fetch(props.packageSettings.brandingConfigUrl)\n .then((res) => {\n if (!res.ok) {\n throw new Error(`HTTP error ${res.status}`);\n }\n return res.json();\n })\n .then((json: unknown) => {\n if (json && typeof json === \"object\") {\n brandingService.setBrandingFromConfig(json as BrandingConfigPayload);\n }\n })\n .catch((err) => {\n debugLogger.error(\"❌ Failed to fetch or apply branding config:\", { error: err });\n });\n }\n\n if (!isPlaygroundMode) {\n loadDocuments();\n embeddingService.backfillMissingEmbeddings().catch((err: unknown) => {\n debugLogger.error(\"❌ Failed to backfill memory embeddings:\", { error: err });\n });\n } else {\n debugLogger.info(\"ChatProvider: Playground mode skipping knowledge backfill\");\n }\n };\n\n initializeAsync();\n }, [props.packageSettings, loadDocuments]);\n\n useEffect(() => {\n const isPlaygroundRoute = typeof window !== \"undefined\" && window.location.pathname.includes(\"/playground\");\n const isPlaygroundMode = isPlaygroundRoute || props.packageSettings.playgroundMode === true;\n\n if (isPlaygroundMode || !props.packageSettings.gatewayApiUrl) {\n return;\n }\n\n const initializeSyncState = async () => {\n try {\n await useConversationSyncStore.getState().initialize();\n } catch (error) {\n debugLogger.error(\"ChatProvider: deferred sync initialization failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleAuthTokenChange = () => {\n void initializeSyncState();\n };\n\n window.addEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.addEventListener(\"pageshow\", handleAuthTokenChange);\n window.addEventListener(\"focus\", handleAuthTokenChange);\n\n return () => {\n window.removeEventListener(AUTH_TOKEN_CHANGED_EVENT, handleAuthTokenChange);\n window.removeEventListener(\"pageshow\", handleAuthTokenChange);\n window.removeEventListener(\"focus\", handleAuthTokenChange);\n };\n }, [props.packageSettings.gatewayApiUrl, props.packageSettings.playgroundMode]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider config={featureFlagConfig}>\n <NotificationProvider>\n {props.children}\n </NotificationProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n\nexport default ChatProvider;\n","import styleInject from '#style-inject';styleInject(\"*,\\n*::before,\\n*::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n}\\n:root {\\n --vh: 1vh;\\n --input-offset: 1.5rem;\\n}\\nhtml {\\n height: 100%;\\n overflow: hidden;\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n}\\nhtml::-webkit-scrollbar {\\n display: none;\\n}\\nbody {\\n height: 100%;\\n overflow: auto;\\n scrollbar-width: none;\\n -ms-overflow-style: none;\\n}\\nbody::-webkit-scrollbar {\\n display: none;\\n}\\na {\\n color: inherit;\\n text-decoration: none;\\n}\\n.container {\\n max-width: 1200px;\\n margin: 0 auto;\\n padding: 2rem;\\n}\\n.mt-2 {\\n margin-top: 0.5rem;\\n}\\n.mb-2 {\\n margin-bottom: 0.5rem;\\n}\\n.mx-auto {\\n margin-left: auto;\\n margin-right: auto;\\n}\\n.bandit-logo-container {\\n display: flex;\\n height: 50vh;\\n margin: auto;\\n}\\n.bandit-logo {\\n margin: auto;\\n display: flex;\\n flex: 1 1 auto;\\n flex-direction: column;\\n align-items: center;\\n width: 90vw;\\n max-width: 640px;\\n height: 55vh;\\n background-size: cover;\\n background-position: center center;\\n background-repeat: no-repeat;\\n transition: opacity 0.6s ease-in-out, transform 0.6s ease-in-out;\\n}\\n.bandit-logo-hidden {\\n opacity: 0;\\n transform: translateY(-10px);\\n pointer-events: none;\\n}\\n.bandit-logo-visible {\\n opacity: 1;\\n transform: translateY(0);\\n}\\n\")"],"mappings":"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","names":["useKnowledgeStore"]}
|
package/dist/index.js
CHANGED
|
@@ -4675,6 +4675,7 @@ var init_gateway_service = __esm({
|
|
|
4675
4675
|
import_axios = __toESM(require("axios"));
|
|
4676
4676
|
import_rxjs6 = require("rxjs");
|
|
4677
4677
|
init_debugLogger();
|
|
4678
|
+
init_authenticationService();
|
|
4678
4679
|
GatewayService = class {
|
|
4679
4680
|
constructor(_baseUrl, _tokenFactory, _feedbackEmail) {
|
|
4680
4681
|
this._baseUrl = _baseUrl;
|
|
@@ -4715,7 +4716,10 @@ var init_gateway_service = __esm({
|
|
|
4715
4716
|
});
|
|
4716
4717
|
instance.interceptors.response.use(
|
|
4717
4718
|
(response) => response,
|
|
4718
|
-
(error) =>
|
|
4719
|
+
(error) => {
|
|
4720
|
+
this._handleAuthFailure(error);
|
|
4721
|
+
return Promise.reject(this._normalizeAxiosError(error));
|
|
4722
|
+
}
|
|
4719
4723
|
);
|
|
4720
4724
|
return instance;
|
|
4721
4725
|
}
|
|
@@ -4736,6 +4740,24 @@ var init_gateway_service = __esm({
|
|
|
4736
4740
|
}
|
|
4737
4741
|
return new Error(error.message);
|
|
4738
4742
|
}
|
|
4743
|
+
_handleAuthFailure(error) {
|
|
4744
|
+
const status = error.response?.status;
|
|
4745
|
+
if (status !== 401 && status !== 403) {
|
|
4746
|
+
return;
|
|
4747
|
+
}
|
|
4748
|
+
const data = error.response?.data;
|
|
4749
|
+
const code = data?.code;
|
|
4750
|
+
if (code !== "FORCE_RELOGIN" && code !== "ACCOUNT_LOCKED") {
|
|
4751
|
+
return;
|
|
4752
|
+
}
|
|
4753
|
+
try {
|
|
4754
|
+
authenticationService.clearToken();
|
|
4755
|
+
} catch {
|
|
4756
|
+
}
|
|
4757
|
+
if (typeof window !== "undefined" && typeof window.dispatchEvent === "function") {
|
|
4758
|
+
window.dispatchEvent(new CustomEvent("auth:force-relogin", { detail: { code } }));
|
|
4759
|
+
}
|
|
4760
|
+
}
|
|
4739
4761
|
_createHttpError(message, response) {
|
|
4740
4762
|
return Object.assign(new Error(message), { response });
|
|
4741
4763
|
}
|
|
@@ -15420,69 +15442,48 @@ var init_source_chips = __esm({
|
|
|
15420
15442
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material11.Box, { sx: { opacity: 0.75, fontSize: 11, wordBreak: "break-all", mt: 0.25 }, children: source.url })
|
|
15421
15443
|
] }),
|
|
15422
15444
|
arrow: true,
|
|
15423
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime14.
|
|
15445
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15424
15446
|
import_material11.Box,
|
|
15425
15447
|
{
|
|
15426
15448
|
component: "a",
|
|
15427
15449
|
href: source.url,
|
|
15428
15450
|
target: "_blank",
|
|
15429
15451
|
rel: "noopener noreferrer",
|
|
15452
|
+
className: "source-chip",
|
|
15430
15453
|
sx: {
|
|
15431
15454
|
display: "inline-flex",
|
|
15432
15455
|
alignItems: "center",
|
|
15456
|
+
justifyContent: "center",
|
|
15433
15457
|
flexShrink: 0,
|
|
15434
|
-
|
|
15435
|
-
height:
|
|
15436
|
-
|
|
15437
|
-
|
|
15438
|
-
|
|
15439
|
-
|
|
15440
|
-
bgcolor: "background.paper",
|
|
15441
|
-
textDecoration: "none",
|
|
15458
|
+
width: 28,
|
|
15459
|
+
height: 28,
|
|
15460
|
+
borderRadius: "50%",
|
|
15461
|
+
border: "2px solid",
|
|
15462
|
+
borderColor: "background.paper",
|
|
15463
|
+
bgcolor: "action.hover",
|
|
15442
15464
|
color: "text.primary",
|
|
15443
|
-
|
|
15444
|
-
|
|
15445
|
-
|
|
15446
|
-
|
|
15465
|
+
textDecoration: "none",
|
|
15466
|
+
// Hover lifts the chip via transform/z-index only — no layout reflow,
|
|
15467
|
+
// so the overlapping stack can never jitter the way the expand did.
|
|
15468
|
+
transition: "transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease",
|
|
15469
|
+
"&:hover": {
|
|
15470
|
+
transform: "translateY(-3px)",
|
|
15471
|
+
boxShadow: 3,
|
|
15472
|
+
borderColor: "primary.main",
|
|
15473
|
+
zIndex: 3
|
|
15474
|
+
}
|
|
15447
15475
|
},
|
|
15448
|
-
children:
|
|
15449
|
-
|
|
15450
|
-
|
|
15451
|
-
|
|
15452
|
-
|
|
15453
|
-
|
|
15454
|
-
|
|
15455
|
-
|
|
15456
|
-
|
|
15457
|
-
|
|
15458
|
-
|
|
15459
|
-
placeItems: "center",
|
|
15460
|
-
fontSize: 9,
|
|
15461
|
-
fontWeight: 700,
|
|
15462
|
-
flexShrink: 0
|
|
15463
|
-
},
|
|
15464
|
-
children: domain.charAt(0).toUpperCase()
|
|
15465
|
-
}
|
|
15466
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15467
|
-
import_material11.Box,
|
|
15468
|
-
{
|
|
15469
|
-
component: "img",
|
|
15470
|
-
src: `https://icons.duckduckgo.com/ip3/${domain}.ico`,
|
|
15471
|
-
alt: "",
|
|
15472
|
-
loading: "lazy",
|
|
15473
|
-
onError: () => setFailed(true),
|
|
15474
|
-
sx: { width: 18, height: 18, borderRadius: "50%", flexShrink: 0 }
|
|
15475
|
-
}
|
|
15476
|
-
),
|
|
15477
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15478
|
-
import_material11.Box,
|
|
15479
|
-
{
|
|
15480
|
-
component: "span",
|
|
15481
|
-
sx: { maxWidth: 150, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" },
|
|
15482
|
-
children: label
|
|
15483
|
-
}
|
|
15484
|
-
)
|
|
15485
|
-
]
|
|
15476
|
+
children: failed ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_material11.Box, { component: "span", sx: { fontSize: 11, fontWeight: 700, color: "primary.main" }, children: domain.charAt(0).toUpperCase() }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15477
|
+
import_material11.Box,
|
|
15478
|
+
{
|
|
15479
|
+
component: "img",
|
|
15480
|
+
src: `https://icons.duckduckgo.com/ip3/${domain}.ico`,
|
|
15481
|
+
alt: "",
|
|
15482
|
+
loading: "lazy",
|
|
15483
|
+
onError: () => setFailed(true),
|
|
15484
|
+
sx: { width: 16, height: 16, borderRadius: "4px", flexShrink: 0 }
|
|
15485
|
+
}
|
|
15486
|
+
)
|
|
15486
15487
|
}
|
|
15487
15488
|
)
|
|
15488
15489
|
}
|
|
@@ -15507,7 +15508,19 @@ var init_source_chips = __esm({
|
|
|
15507
15508
|
children: "Sources"
|
|
15508
15509
|
}
|
|
15509
15510
|
),
|
|
15510
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15511
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
15512
|
+
import_material11.Box,
|
|
15513
|
+
{
|
|
15514
|
+
sx: {
|
|
15515
|
+
display: "flex",
|
|
15516
|
+
alignItems: "center",
|
|
15517
|
+
// Overlapping stack; each chip lifts on hover (no reflow → no jitter).
|
|
15518
|
+
"& .source-chip": { ml: "-9px" },
|
|
15519
|
+
"& .source-chip:first-of-type": { ml: 0 }
|
|
15520
|
+
},
|
|
15521
|
+
children: sources.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SourceChip, { source: s }, `${s.url}-${i}`))
|
|
15522
|
+
}
|
|
15523
|
+
)
|
|
15511
15524
|
] });
|
|
15512
15525
|
};
|
|
15513
15526
|
source_chips_default = SourceChips;
|
|
@@ -21697,6 +21710,15 @@ ${fn}(${argStr})
|
|
|
21697
21710
|
\`\`\``;
|
|
21698
21711
|
}
|
|
21699
21712
|
}
|
|
21713
|
+
if (!/```(?:tool_code|TOOL_CODE)/.test(fullMessage)) {
|
|
21714
|
+
const plainToolFence = /```[a-zA-Z0-9_-]*[ \t]*\n([ \t]*(?:web_search|web_fetch|image_generation|create_file|ask_user)[\s\S]*?)\n```/;
|
|
21715
|
+
const fm = fullMessage.match(plainToolFence);
|
|
21716
|
+
if (fm) {
|
|
21717
|
+
fullMessage = fullMessage.replace(plainToolFence, `\`\`\`tool_code
|
|
21718
|
+
${fm[1].trim()}
|
|
21719
|
+
\`\`\``);
|
|
21720
|
+
}
|
|
21721
|
+
}
|
|
21700
21722
|
const toolCallMatches = fullMessage.match(/```(?:tool_code|TOOL_CODE)\s*\n([^`]+)\n```/gi);
|
|
21701
21723
|
let enhancedMessage = fullMessage;
|
|
21702
21724
|
const summarizableResults = [];
|
|
@@ -23935,6 +23957,7 @@ var init_conversation_drawer = __esm({
|
|
|
23935
23957
|
init_authenticationStore();
|
|
23936
23958
|
init_packageSettingsStore();
|
|
23937
23959
|
init_brandingService();
|
|
23960
|
+
init_authenticationService();
|
|
23938
23961
|
init_project_management_modal();
|
|
23939
23962
|
init_memory_modal();
|
|
23940
23963
|
init_move_conversation_modal();
|
|
@@ -24669,23 +24692,46 @@ var init_conversation_drawer = __esm({
|
|
|
24669
24692
|
]
|
|
24670
24693
|
}
|
|
24671
24694
|
),
|
|
24672
|
-
user2 && /* @__PURE__ */ (0, import_jsx_runtime25.
|
|
24673
|
-
|
|
24674
|
-
|
|
24675
|
-
|
|
24676
|
-
|
|
24677
|
-
|
|
24678
|
-
|
|
24679
|
-
|
|
24680
|
-
|
|
24681
|
-
|
|
24682
|
-
|
|
24683
|
-
|
|
24684
|
-
|
|
24685
|
-
|
|
24686
|
-
|
|
24687
|
-
|
|
24688
|
-
|
|
24695
|
+
user2 && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
|
|
24696
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
24697
|
+
import_material23.Box,
|
|
24698
|
+
{
|
|
24699
|
+
sx: {
|
|
24700
|
+
flexShrink: 0,
|
|
24701
|
+
display: "flex",
|
|
24702
|
+
alignItems: "center",
|
|
24703
|
+
justifyContent: "center",
|
|
24704
|
+
width: 30,
|
|
24705
|
+
height: 30,
|
|
24706
|
+
borderRadius: "50%",
|
|
24707
|
+
border: `1px solid ${(0, import_material23.alpha)(theme.palette.divider, 0.8)}`,
|
|
24708
|
+
color: theme.palette.text.secondary
|
|
24709
|
+
},
|
|
24710
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react9.Settings, { size: 16 })
|
|
24711
|
+
}
|
|
24712
|
+
),
|
|
24713
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
24714
|
+
import_material23.IconButton,
|
|
24715
|
+
{
|
|
24716
|
+
"aria-label": "Sign out",
|
|
24717
|
+
title: "Sign out",
|
|
24718
|
+
onClick: (event) => {
|
|
24719
|
+
event.stopPropagation();
|
|
24720
|
+
authenticationService.clearToken();
|
|
24721
|
+
window.location.href = "/login";
|
|
24722
|
+
},
|
|
24723
|
+
sx: {
|
|
24724
|
+
flexShrink: 0,
|
|
24725
|
+
width: 30,
|
|
24726
|
+
height: 30,
|
|
24727
|
+
border: `1px solid ${(0, import_material23.alpha)(theme.palette.error.main, 0.4)}`,
|
|
24728
|
+
color: theme.palette.error.main,
|
|
24729
|
+
"&:hover": { bgcolor: (0, import_material23.alpha)(theme.palette.error.main, 0.1) }
|
|
24730
|
+
},
|
|
24731
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react9.LogOut, { size: 16 })
|
|
24732
|
+
}
|
|
24733
|
+
)
|
|
24734
|
+
] })
|
|
24689
24735
|
]
|
|
24690
24736
|
}
|
|
24691
24737
|
)
|
|
@@ -24785,6 +24831,7 @@ var init_enhanced_mobile_conversations_modal = __esm({
|
|
|
24785
24831
|
init_packageSettingsStore();
|
|
24786
24832
|
init_memory_modal();
|
|
24787
24833
|
init_brandingService();
|
|
24834
|
+
init_authenticationService();
|
|
24788
24835
|
init_project_management_modal();
|
|
24789
24836
|
init_move_conversation_modal();
|
|
24790
24837
|
init_simple_conversation_item();
|
|
@@ -25641,23 +25688,46 @@ var init_enhanced_mobile_conversations_modal = __esm({
|
|
|
25641
25688
|
}
|
|
25642
25689
|
)
|
|
25643
25690
|
] }),
|
|
25644
|
-
user2 && /* @__PURE__ */ (0, import_jsx_runtime26.
|
|
25645
|
-
|
|
25646
|
-
|
|
25647
|
-
|
|
25648
|
-
|
|
25649
|
-
|
|
25650
|
-
|
|
25651
|
-
|
|
25652
|
-
|
|
25653
|
-
|
|
25654
|
-
|
|
25655
|
-
|
|
25656
|
-
|
|
25657
|
-
|
|
25658
|
-
|
|
25659
|
-
|
|
25660
|
-
|
|
25691
|
+
user2 && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
|
|
25692
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
25693
|
+
import_material24.Box,
|
|
25694
|
+
{
|
|
25695
|
+
sx: {
|
|
25696
|
+
flexShrink: 0,
|
|
25697
|
+
display: "flex",
|
|
25698
|
+
alignItems: "center",
|
|
25699
|
+
justifyContent: "center",
|
|
25700
|
+
width: 30,
|
|
25701
|
+
height: 30,
|
|
25702
|
+
borderRadius: "50%",
|
|
25703
|
+
border: `1px solid ${(0, import_styles15.alpha)(theme.palette.divider, 0.8)}`,
|
|
25704
|
+
color: theme.palette.text.secondary
|
|
25705
|
+
},
|
|
25706
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react10.Settings, { size: 16 })
|
|
25707
|
+
}
|
|
25708
|
+
),
|
|
25709
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
25710
|
+
import_material24.IconButton,
|
|
25711
|
+
{
|
|
25712
|
+
"aria-label": "Sign out",
|
|
25713
|
+
title: "Sign out",
|
|
25714
|
+
onClick: (event) => {
|
|
25715
|
+
event.stopPropagation();
|
|
25716
|
+
authenticationService.clearToken();
|
|
25717
|
+
window.location.href = "/login";
|
|
25718
|
+
},
|
|
25719
|
+
sx: {
|
|
25720
|
+
flexShrink: 0,
|
|
25721
|
+
width: 30,
|
|
25722
|
+
height: 30,
|
|
25723
|
+
border: `1px solid ${(0, import_styles15.alpha)(theme.palette.error.main, 0.4)}`,
|
|
25724
|
+
color: theme.palette.error.main,
|
|
25725
|
+
"&:hover": { bgcolor: (0, import_styles15.alpha)(theme.palette.error.main, 0.1) }
|
|
25726
|
+
},
|
|
25727
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react10.LogOut, { size: 16 })
|
|
25728
|
+
}
|
|
25729
|
+
)
|
|
25730
|
+
] })
|
|
25661
25731
|
]
|
|
25662
25732
|
}
|
|
25663
25733
|
)
|