@adminide-stack/yantra-mobile 12.0.28-alpha.54 → 12.0.28-alpha.59
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/lib/assets/icon.png +0 -0
- package/lib/components/CustomDrawer.js +358 -0
- package/lib/components/CustomDrawer.js.map +1 -0
- package/lib/components/GatewayToolbarButtonMobile.js +84 -0
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
- package/lib/components/YantraBrandLoader.js +94 -0
- package/lib/components/YantraBrandLoader.js.map +1 -0
- package/lib/compute.js +37 -5
- package/lib/compute.js.map +1 -1
- package/lib/config/constants.js +16 -0
- package/lib/config/constants.js.map +1 -0
- package/lib/config/env-config.js +74 -19
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/GatewayContext.js +77 -0
- package/lib/contexts/GatewayContext.js.map +1 -0
- package/lib/graphql/agentGatewayDocuments.js +53 -0
- package/lib/graphql/agentGatewayDocuments.js.map +1 -0
- package/lib/hooks/useCdecliAutoConnect.js +219 -0
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +226 -0
- package/lib/hooks/useCdecliChannel.js.map +1 -0
- package/lib/hooks/useChatApi.js +220 -170
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +232 -58
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useGatewayConnection.js +123 -0
- package/lib/hooks/useGatewayConnection.js.map +1 -0
- package/lib/hooks/useGatewayRegistry.js +28 -0
- package/lib/hooks/useGatewayRegistry.js.map +1 -0
- package/lib/hooks/usePrerequisiteIds.js +122 -0
- package/lib/hooks/usePrerequisiteIds.js.map +1 -0
- package/lib/hooks/useWorkspaceProvisioner.js +236 -0
- package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +8 -5
- package/lib/screens/Home/HomeScreen.js +420 -97
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +229 -0
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
- package/lib/screens/Home/components/DeepSearchModal.js +334 -0
- package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
- package/lib/screens/Home/deepSearchUtils.js +41 -0
- package/lib/screens/Home/deepSearchUtils.js.map +1 -0
- package/lib/screens/NewChat/index.js +75 -0
- package/lib/screens/NewChat/index.js.map +1 -0
- package/lib/services/agentSessionManager.js +451 -0
- package/lib/services/agentSessionManager.js.map +1 -0
- package/lib/services/gatewayApiKeyBridge.js +4 -0
- package/lib/services/gatewayApiKeyBridge.js.map +1 -0
- package/lib/services/gatewayClient.js +470 -0
- package/lib/services/gatewayClient.js.map +1 -0
- package/lib/utils/gatewaySelectionStorage.js +21 -0
- package/lib/utils/gatewaySelectionStorage.js.map +1 -0
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { useGetAccountChatSessionsQuery } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useNavigation } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const navigation = useNavigation();\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n\n const { createSession } = useChatMutations();\n const chat = useChatStream(activeSessionId);\n\n useGetAccountChatSessionsQuery({\n variables: { first: 25, includeArchived: false },\n fetchPolicy: 'cache-first',\n });\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery;\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = isResearchMode ? 'Research anything...' : 'Ask anything...';\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n // Research (deep-search): delegate to parent when provided, like browser NewChatPage → session page\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n setValue('');\n sendMessage(trimmedQuery, undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n setValue('');\n sendMessage(trimmedQuery);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n createSession,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setActiveSessionId(null);\n setValue('');\n }, []);\n\n useEffect(() => {\n navigation.setOptions({\n headerRight: () => (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={26} color=\"#000\" />\n </Pressable>\n ),\n });\n }, [navigation, handleNewChat]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n return;\n }\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n sendMessage(text.trim(), undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n sendMessage(text.trim());\n }\n },\n [isLoading, disabled, activeSessionId, activeMode, onSubmitProp, createSession, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { onClick: () => console.log('camera') },\n image: { onClick: () => console.log('image') },\n attach: { onClick: () => console.log('attach') },\n });\n\n return (\n <SafeAreaView style={{ flex: 1, backgroundColor: '#fff' }}>\n <Box flex={1} width=\"100%\">\n {chatError && (\n <Box mb=\"$2\" mx=\"$4\" p=\"$3\" bg=\"$gray200\" borderRadius=\"$md\">\n <Text fontSize=\"$sm\" color=\"$gray900\">\n {chatError}\n </Text>\n </Box>\n )}\n {hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"plan\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop={true}\n messagesContainerStyle={{ paddingHorizontal: 0, paddingTop: 0, margin: 0 }}\n listContentStyle={{ paddingTop: 0, margin: 0 }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={({ value, onChange, onSend, disabled: inputDisabled }) => (\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => onChange(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: inputDisabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: value.trim().length > 0,\n onSend: () => onSend(value.trim()),\n onMic: () => console.log('mic'),\n disabled: inputDisabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n )}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} justifyContent=\"center\" alignItems=\"stretch\" p=\"$4\">\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop,\n }}\n />\n </Box>\n )}\n </Box>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n newChatButton: {\n padding: 6,\n marginRight: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["uuidv4","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, StackActions, CommonActions } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { useGatewayContext } from '../../contexts/GatewayContext';\nimport { GatewayToolbarButtonMobile } from '../../components/GatewayToolbarButtonMobile';\nimport { useCdecliAutoConnect } from '../../hooks/useCdecliAutoConnect';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useChatMutations, useChatSessions } from '../../hooks/useChatApi';\nimport { useChatStream, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport DeepSearchModal from './components/DeepSearchModal';\nimport ChatHistoryLanding from './components/ChatHistoryLanding';\nimport { extractDeepSearchSources, normalizeSummaryText, type DeepSearchSourceItem } from './deepSearchUtils';\nimport { YantraBrandLoader, YANTRA_LOADER_SIZE_COMPACT } from '../../components/YantraBrandLoader';\nimport { navigationRef } from '@common-stack/client-react';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\n/** Reserve the bottom composer band (toolbar + mode row) so the sending loader centers in the messages area above it. */\nconst SENDING_LOADER_COMPOSER_RESERVE_PX = 156;\n\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nfunction projectFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { project?: string };\n const p = parsed?.project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'project' in settings) {\n const p = (settings as { project?: unknown }).project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n }\n return null;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const navigation = useNavigation();\n const route = useRoute<any>();\n const hasRehydratedOrgRef = React.useRef(false);\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n const [isDeepSearchModalOpen, setIsDeepSearchModalOpen] = useState(false);\n const [deepSearchQuery, setDeepSearchQuery] = useState<string | null>(null);\n const [deepSearchSummary, setDeepSearchSummary] = useState('');\n const [deepSearchSources, setDeepSearchSources] = useState<DeepSearchSourceItem[]>([]);\n const [researchProcessOpen, setResearchProcessOpen] = useState(true);\n const [sourcesAccordionOpen, setSourcesAccordionOpen] = useState(true);\n /** Full-screen chat history list opened from header (chat UI remains default). */\n const [showChatHistory, setShowChatHistory] = useState(false);\n /** True while creating channel id before send (covers UI delay before chatLoading flips). */\n const [channelBootstrap, setChannelBootstrap] = useState(false);\n\n const { createChannel } = useChatMutations();\n const { sessions } = useChatSessions();\n const { orgName: resolvedOrgName, projectId } = usePrerequisiteIds();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const { data: pageSettingsData } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n const fallbackOrgNameFromSettings = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const fallbackProjectIdFromSettings = useMemo(\n () => projectFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || fallbackOrgNameFromSettings || routeOrgName || null;\n /** Prefer hook (same source as web); fall back to this screen's page settings when prerequisites lag one frame. */\n const effectiveProjectId = projectId || fallbackProjectIdFromSettings || null;\n const { selectedGateway } = useGatewayContext();\n const cdecliSelected = selectedGateway?.channelType === 'cdecli-serve';\n const cdecli = useCdecliAutoConnect(cdecliSelected, activeSessionId ?? undefined);\n\n /** Same gate as web ChatSessionPage (`cdecliConnected`): only route via gateway when the channel is live. */\n const cdecliConnected = cdecliSelected && cdecli.channelConnected;\n\n const effectivePersistenceMode = cdecli.persistenceMode ?? selectedGateway?.persistenceMode ?? 'frontend';\n\n const chatRouting: UseChatStreamRouting = useMemo(\n () =>\n cdecliConnected\n ? {\n kind: 'cdecli',\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode: effectivePersistenceMode,\n }\n : { kind: 'groq' },\n [cdecliConnected, cdecli.channelConnected, cdecli.accountId, effectivePersistenceMode],\n );\n\n const chat = useChatStream(activeSessionId, chatRouting);\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n clearMessages,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : 'Ask anything...';\n const waitingForAssistant = useMemo(() => {\n if ((!chatLoading && !isStreaming) || messages.length === 0) return false;\n return messages[messages.length - 1]?.role === 'user';\n }, [chatLoading, isStreaming, messages]);\n\n /** Thread has bubbles or streaming buffer → anchor loader above composer; empty landing → center. */\n const pinSendingLoaderNearComposer = useMemo(\n () => messages.length > 0 || Boolean((response ?? '').trim()),\n [messages.length, response],\n );\n\n const showSendingLoader = !showChatHistory && (channelBootstrap || waitingForAssistant);\n\n const insets = useSafeAreaInsets();\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n // Web-aligned flow: create channel first, then send first post using returned channel id.\n const ensureSessionId = useCallback(\n async (mode: RoutingMode): Promise<string> => {\n if (activeSessionId) return activeSessionId;\n if (!effectiveOrgName || !effectiveProjectId) {\n throw new Error('Workspace is still initializing. Please retry in a moment.');\n }\n const requestedChannelId = uuidv4();\n const title =\n mode === 'deep-search' ? `deep-search-${requestedChannelId}` : `chat-channel-${requestedChannelId}`;\n const session = await createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: effectiveProjectId,\n } as any);\n setActiveSessionId(session.id);\n return session.id;\n },\n [activeSessionId, createChannel, effectiveOrgName, effectiveProjectId],\n );\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setValue('');\n setDeepSearchQuery(trimmedQuery);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n setValue('');\n await sendMessage(trimmedQuery, undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n ensureSessionId,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }, [clearMessages]);\n\n const handleOpenChatHistory = useCallback(() => {\n setShowChatHistory(true);\n }, []);\n\n const handleCloseChatHistory = useCallback(() => {\n setShowChatHistory(false);\n }, []);\n\n const handleToggleGateway = useCallback(() => {\n // CDeCLI connection is selection-driven via useCdecliAutoConnect.\n }, []);\n\n const gatewayToolbarStatus =\n cdecli.status === 'connecting'\n ? 'connecting'\n : cdecli.status === 'connected'\n ? 'connected'\n : cdecli.status === 'error'\n ? 'error'\n : 'disconnected';\n\n const gatewayToolbarTone = 'default';\n\n const gatewayToolbarLabel = cdecli.status === 'connecting' ? 'Checking...' : undefined;\n\n const gatewayToolbarError = cdecli.error;\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (!effectiveOrgName || currentOrgName === effectiveOrgName) return;\n // Keep current screen params in sync with resolved org context.\n (navigation as any).setParams?.({ orgName: effectiveOrgName });\n }, [navigation, route?.params?.orgName, effectiveOrgName]);\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (hasRehydratedOrgRef.current || currentOrgName || !effectiveOrgName) return;\n\n hasRehydratedOrgRef.current = true;\n console.log('effectiveOrgName..', effectiveOrgName);\n // navigationRef.navigate('MainStack.Layout.Home', {\n // orgName: effectiveOrgName,\n // });\n // Also navigate with merge=true to patch parent stack params in nested navigation state.\n navigation.getParent()?.dispatch(\n CommonActions.navigate('MainStack', {\n screen: 'MainStack.Layout.Home',\n params: {\n orgName: effectiveOrgName,\n },\n merge: true,\n key: Date.now().toString(),\n }),\n );\n\n // CommonActions.reset({\n // index: 0,\n // routes: [\n // {\n // name: 'MainStack',\n // state: {\n // routes: [\n // {\n // name: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // },\n // ],\n // },\n // },\n // ],\n // });\n\n // (navigation as any).navigate('MainStack', {\n // screen: 'MainStack.Layout.Home',\n // params: { orgName: effectiveOrgName },\n // merge: true,\n // key: Date.now().toString(),\n // });\n }, [navigation, route?.params?.orgName, effectiveOrgName, navigationRef]);\n\n useEffect(() => {\n navigation.setOptions({\n drawerLabel: 'Chat',\n headerTitle: showChatHistory ? 'Chats' : 'Yantra',\n headerLeft: showChatHistory\n ? () => (\n <Pressable\n onPress={handleCloseChatHistory}\n style={({ pressed }) => [styles.backButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"Back to chat\"\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={24} color=\"#111827\" />\n </Pressable>\n )\n : undefined,\n headerRight: () => (\n <View style={styles.headerRight}>\n <GatewayToolbarButtonMobile\n gatewayStatus={gatewayToolbarStatus}\n gatewayError={gatewayToolbarError}\n onToggleGateway={handleToggleGateway}\n disabled={false}\n statusLabel={gatewayToolbarLabel}\n tone={gatewayToolbarTone}\n />\n {!showChatHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [\n styles.historyHeaderButton,\n pressed && styles.historyHeaderButtonPressed,\n ]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n >\n <View style={styles.historyHeaderButtonInner}>\n <MaterialCommunityIcons name=\"history\" size={19} color=\"#4338ca\" />\n </View>\n </Pressable>\n ) : null}\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={26} color=\"#000\" />\n </Pressable>\n </View>\n ),\n });\n }, [\n navigation,\n showChatHistory,\n handleCloseChatHistory,\n handleOpenChatHistory,\n handleNewChat,\n handleToggleGateway,\n gatewayToolbarStatus,\n gatewayToolbarError,\n gatewayToolbarLabel,\n gatewayToolbarTone,\n ]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search') {\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n setDeepSearchQuery(text.trim());\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setIsDeepSearchModalOpen(true);\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create deep-search session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n return;\n }\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('chat');\n await sendMessage(text.trim(), undefined, sessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n } finally {\n setChannelBootstrap(false);\n }\n },\n [isLoading, disabled, activeMode, onSubmitProp, ensureSessionId, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false, onClick: () => console.log('camera') },\n image: { enabled: false, onClick: () => console.log('image') },\n attach: { enabled: false, onClick: () => console.log('attach') },\n });\n const latestAssistantMessage = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i]?.role === 'assistant') return messages[i]?.content ?? '';\n }\n return '';\n }, [messages]);\n\n const deepSearchPreviewContent = response || deepSearchSummary;\n const deepSearchPreviewNormalized = useMemo(\n () => normalizeSummaryText(deepSearchPreviewContent || deepSearchSummary || ''),\n [deepSearchPreviewContent, deepSearchSummary],\n );\n\n const handleDeepSearchClose = useCallback(() => {\n if (isStreaming) {\n cancel();\n }\n setIsDeepSearchModalOpen(false);\n setDeepSearchQuery(null);\n setDeepSearchSummary('');\n setDeepSearchSources([]);\n setResearchProcessOpen(true);\n setSourcesAccordionOpen(true);\n }, [isStreaming, cancel]);\n\n const handleRetryDeepSearch = useCallback(async () => {\n if (!deepSearchQuery || isStreaming) return;\n try {\n setChannelBootstrap(true);\n const sessionId = await ensureSessionId('deep-search');\n await sendMessage(deepSearchQuery, undefined, sessionId);\n } catch (error) {\n console.error('[HomeScreen] Failed to retry deep-search:', error);\n } finally {\n setChannelBootstrap(false);\n }\n }, [deepSearchQuery, isStreaming, ensureSessionId, sendMessage]);\n\n useEffect(() => {\n if (!deepSearchQuery || isStreaming || !latestAssistantMessage) return;\n setDeepSearchSummary(normalizeSummaryText(latestAssistantMessage));\n setDeepSearchSources(extractDeepSearchSources(latestAssistantMessage));\n }, [deepSearchQuery, isStreaming, latestAssistantMessage]);\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={{ flex: 1, backgroundColor: '#fff' }}>\n <Box flex={1} width=\"100%\" position=\"relative\">\n {(chatError || cdecli.error) && (\n <Box mb=\"$2\" mx=\"$4\" p=\"$3\" bg=\"$gray200\" borderRadius=\"$md\">\n <Text fontSize=\"$sm\" color=\"$gray900\">\n {chatError || cdecli.error}\n </Text>\n </Box>\n )}\n {showChatHistory ? (\n <ChatHistoryLanding\n onSelectSession={(channelId) => {\n setShowChatHistory(false);\n setActiveSessionId(channelId);\n setActiveMode('chat');\n }}\n onCompose={() => {\n setShowChatHistory(false);\n setActiveSessionId(null);\n setValue('');\n clearMessages();\n }}\n />\n ) : hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"chat\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop={false}\n messagesContainerStyle={{ paddingHorizontal: 0, paddingTop: 6, margin: 0 }}\n listContentStyle={{ paddingTop: 8, margin: 0 }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={({ value, onChange, onSend, disabled: inputDisabled }) => (\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => onChange(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: inputDisabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: value.trim().length > 0,\n onSend: () => onSend(value.trim()),\n onMic: () => console.log('mic'),\n disabled: inputDisabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n )}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} width=\"100%\">\n <View style={styles.emptyCenterTitleWrap}>\n <Text style={styles.emptyCenterTitle}>What can I do for you?</Text>\n </View>\n <View\n style={[\n styles.bottomComposerWrap,\n {\n paddingBottom: Math.max(insets.bottom - 6, 2),\n marginBottom: -Math.max(insets.bottom - 2, 0),\n },\n ]}\n >\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop,\n }}\n />\n </View>\n </Box>\n )}\n {showSendingLoader ? (\n <View\n pointerEvents=\"none\"\n style={\n pinSendingLoaderNearComposer\n ? [\n styles.sendingLoaderAboveComposer,\n {\n bottom: Math.max(insets.bottom, 12) + SENDING_LOADER_COMPOSER_RESERVE_PX,\n },\n ]\n : styles.sendingLoaderEmptyState\n }\n >\n <YantraBrandLoader size={YANTRA_LOADER_SIZE_COMPACT} />\n </View>\n ) : null}\n </Box>\n <DeepSearchModal\n visible={isDeepSearchModalOpen}\n query={deepSearchQuery}\n summaryText={deepSearchPreviewNormalized}\n sources={deepSearchSources}\n isStreaming={isStreaming}\n researchProcessOpen={researchProcessOpen}\n sourcesAccordionOpen={sourcesAccordionOpen}\n onToggleResearchProcess={() => setResearchProcessOpen((prev) => !prev)}\n onToggleSourcesAccordion={() => setSourcesAccordionOpen((prev) => !prev)}\n onRetry={() => {\n void handleRetryDeepSearch();\n }}\n onStop={cancel}\n onClose={handleDeepSearchClose}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n /** First message / empty screen: loader in the middle of the pane. */\n sendingLoaderEmptyState: {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 40,\n },\n /** Active thread: loader just above the input, not over message history. */\n sendingLoaderAboveComposer: {\n position: 'absolute',\n left: 0,\n right: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n paddingBottom: 8,\n zIndex: 40,\n },\n headerRight: {\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 4,\n gap: 2,\n },\n historyHeaderButton: {\n marginHorizontal: 2,\n padding: 4,\n borderRadius: 22,\n },\n historyHeaderButtonPressed: {\n opacity: 0.72,\n },\n historyHeaderButtonInner: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#eef2ff',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(67, 56, 202, 0.22)',\n shadowColor: '#4338ca',\n shadowOpacity: 0.12,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n newChatButton: {\n padding: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n backButton: {\n marginLeft: 6,\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f3f4f6',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n emptyCenterTitleWrap: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 24,\n paddingTop: 44,\n },\n emptyCenterTitle: {\n fontSize: 52 / 2,\n fontWeight: '400',\n color: '#111827',\n textAlign: 'center',\n letterSpacing: 0.2,\n },\n bottomComposerWrap: {\n paddingHorizontal: 14,\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["_a","uuidv4","_b","_c","value"],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import React from'react';import {View,StyleSheet,ScrollView,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {RoomType}from'common';import {useApolloClient}from'@apollo/client/index.js';import {AI_ASSISTANT_CHANNELS_QUERY_VARS}from'../../../hooks/useChatApi.js';import {useGetChannelsByUserWithLastMessageQuery,MessagesDocument}from'common/graphql';import {YantraBrandLoader}from'../../../components/YantraBrandLoader.js';const MESSAGES_PER_CHANNEL = 200;
|
|
2
|
+
function truncatePreview(text, max = 64) {
|
|
3
|
+
const cleaned = text.replace(/\s+/g, " ").trim();
|
|
4
|
+
if (cleaned.length <= max) return cleaned;
|
|
5
|
+
return `${cleaned.slice(0, max).trim()}...`;
|
|
6
|
+
}
|
|
7
|
+
function stripModelCostHeader(content) {
|
|
8
|
+
const normalized = content.replace(/\r\n/g, "\n");
|
|
9
|
+
return normalized.replace(/^\s*(?:[^\w\n]+\s*)?[a-z0-9][a-z0-9._-]*\s*\(\s*\$[\d.]+\s*\/\s*MTok\s+in\s*\)\s*\n+/i, "");
|
|
10
|
+
}
|
|
11
|
+
function getPostRole(post) {
|
|
12
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
13
|
+
return (_h = (_g = (_e = (_b = (_a = post == null ? void 0 : post.propsConfiguration) == null ? void 0 : _a.content) == null ? void 0 : _b.role) != null ? _e : (_d = (_c = post == null ? void 0 : post.propsConfiguration) == null ? void 0 : _c.contents) == null ? void 0 : _d.role) != null ? _g : (_f = post == null ? void 0 : post.props) == null ? void 0 : _f.role) != null ? _h : void 0;
|
|
14
|
+
}
|
|
15
|
+
function sortPostsByTimeAsc(posts) {
|
|
16
|
+
return [...posts].sort((a, b) => {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
const ta = new Date((_b = (_a = a == null ? void 0 : a.createdAt) != null ? _a : a == null ? void 0 : a.updatedAt) != null ? _b : 0).getTime();
|
|
19
|
+
const tb = new Date((_d = (_c = b == null ? void 0 : b.createdAt) != null ? _c : b == null ? void 0 : b.updatedAt) != null ? _d : 0).getTime();
|
|
20
|
+
return ta - tb;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function buildSessionsFromMessages(posts) {
|
|
24
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
|
|
25
|
+
const sortedAsc = sortPostsByTimeAsc(posts);
|
|
26
|
+
const rows = [];
|
|
27
|
+
const hasExplicitUserRole = sortedAsc.some((post) => String(getPostRole(post)).toUpperCase() === "USER");
|
|
28
|
+
for (let i = 0; i < sortedAsc.length; i++) {
|
|
29
|
+
const current = sortedAsc[i];
|
|
30
|
+
const role = getPostRole(current);
|
|
31
|
+
if (hasExplicitUserRole && String(role).toUpperCase() !== "USER") continue;
|
|
32
|
+
const titleRaw = stripModelCostHeader(String((_a = current == null ? void 0 : current.message) != null ? _a : "").trim()) || "New Chat";
|
|
33
|
+
let previewRaw = titleRaw;
|
|
34
|
+
for (let j = i + 1; j < sortedAsc.length; j++) {
|
|
35
|
+
const next = sortedAsc[j];
|
|
36
|
+
const nextRole = getPostRole(next);
|
|
37
|
+
if (String(nextRole).toUpperCase() === "ASSISTANT") {
|
|
38
|
+
previewRaw = stripModelCostHeader(String((_b = next == null ? void 0 : next.message) != null ? _b : "").trim()) || titleRaw;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const sessionChannelId = String((_e = (_d = (_c = current == null ? void 0 : current.channel) == null ? void 0 : _c.id) != null ? _d : current == null ? void 0 : current.channel) != null ? _e : "");
|
|
43
|
+
if (!sessionChannelId) continue;
|
|
44
|
+
rows.push({
|
|
45
|
+
id: String((_f = current == null ? void 0 : current.id) != null ? _f : `${sessionChannelId}-${i}`),
|
|
46
|
+
channelId: sessionChannelId,
|
|
47
|
+
title: truncatePreview(titleRaw, 44),
|
|
48
|
+
preview: truncatePreview(previewRaw, 72),
|
|
49
|
+
sortAt: new Date((_h = (_g = current == null ? void 0 : current.updatedAt) != null ? _g : current == null ? void 0 : current.createdAt) != null ? _h : 0).getTime()
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (rows.length > 0) {
|
|
53
|
+
return rows.reverse();
|
|
54
|
+
}
|
|
55
|
+
const fallbackRows = [];
|
|
56
|
+
const seenChannelIds = /* @__PURE__ */ new Set();
|
|
57
|
+
for (let i = sortedAsc.length - 1; i >= 0; i--) {
|
|
58
|
+
const post = sortedAsc[i];
|
|
59
|
+
const sessionChannelId = String((_k = (_j = (_i = post == null ? void 0 : post.channel) == null ? void 0 : _i.id) != null ? _j : post == null ? void 0 : post.channel) != null ? _k : "");
|
|
60
|
+
if (!sessionChannelId || seenChannelIds.has(sessionChannelId)) continue;
|
|
61
|
+
seenChannelIds.add(sessionChannelId);
|
|
62
|
+
const text = stripModelCostHeader(String((_l = post == null ? void 0 : post.message) != null ? _l : "").trim()) || "New Chat";
|
|
63
|
+
fallbackRows.push({
|
|
64
|
+
id: String((_m = post == null ? void 0 : post.id) != null ? _m : `${sessionChannelId}-${i}`),
|
|
65
|
+
channelId: sessionChannelId,
|
|
66
|
+
title: truncatePreview(text, 44),
|
|
67
|
+
preview: truncatePreview(text, 72),
|
|
68
|
+
sortAt: new Date((_o = (_n = post == null ? void 0 : post.updatedAt) != null ? _n : post == null ? void 0 : post.createdAt) != null ? _o : 0).getTime()
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return fallbackRows;
|
|
72
|
+
}
|
|
73
|
+
function ChatHistoryRow({
|
|
74
|
+
session,
|
|
75
|
+
onSelectSession
|
|
76
|
+
}) {
|
|
77
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onSelectSession(session.channelId), style: ({
|
|
78
|
+
pressed
|
|
79
|
+
}) => [styles.item, pressed && styles.itemPressed], children: [
|
|
80
|
+
/* @__PURE__ */ jsx(View, { style: styles.itemTop, children: /* @__PURE__ */ jsx(Text, { style: styles.titleText, fontSize: "$lg", color: "$gray900", fontWeight: "$semibold", numberOfLines: 1, children: session.title }) }),
|
|
81
|
+
/* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: "$gray600", numberOfLines: 1, children: session.preview })
|
|
82
|
+
] }, session.id);
|
|
83
|
+
}
|
|
84
|
+
function ChatHistoryLanding({
|
|
85
|
+
onSelectSession,
|
|
86
|
+
onCompose
|
|
87
|
+
}) {
|
|
88
|
+
const client = useApolloClient();
|
|
89
|
+
const {
|
|
90
|
+
data: channelsData,
|
|
91
|
+
loading: channelsLoading
|
|
92
|
+
} = useGetChannelsByUserWithLastMessageQuery({
|
|
93
|
+
variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,
|
|
94
|
+
fetchPolicy: "cache-and-network",
|
|
95
|
+
errorPolicy: "all",
|
|
96
|
+
notifyOnNetworkStatusChange: true,
|
|
97
|
+
returnPartialData: true,
|
|
98
|
+
context: {
|
|
99
|
+
cacheKey: "channels-list"
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const [sessions, setSessions] = React.useState([]);
|
|
103
|
+
const [threadsLoading, setThreadsLoading] = React.useState(false);
|
|
104
|
+
React.useEffect(() => {
|
|
105
|
+
let mounted = true;
|
|
106
|
+
const load = async () => {
|
|
107
|
+
var _a;
|
|
108
|
+
const channels = ((_a = channelsData == null ? void 0 : channelsData.channelsByUser) != null ? _a : []).filter((c) => Boolean(c == null ? void 0 : c.id) && (!(c == null ? void 0 : c.type) || c.type === RoomType.Aiassistant));
|
|
109
|
+
if (channels.length === 0) {
|
|
110
|
+
if (mounted) setSessions([]);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
setThreadsLoading(true);
|
|
114
|
+
try {
|
|
115
|
+
const rowsByChannel = await Promise.all(channels.map(async (channel) => {
|
|
116
|
+
var _a2, _b, _c;
|
|
117
|
+
const channelId = String(channel.id);
|
|
118
|
+
const result = await client.query({
|
|
119
|
+
query: MessagesDocument,
|
|
120
|
+
variables: {
|
|
121
|
+
channelId,
|
|
122
|
+
parentId: null,
|
|
123
|
+
limit: MESSAGES_PER_CHANNEL,
|
|
124
|
+
skip: 0
|
|
125
|
+
},
|
|
126
|
+
fetchPolicy: "cache-first",
|
|
127
|
+
context: {
|
|
128
|
+
cacheKey: "messages-list"
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return buildSessionsFromMessages((_c = (_b = (_a2 = result == null ? void 0 : result.data) == null ? void 0 : _a2.messages) == null ? void 0 : _b.data) != null ? _c : []);
|
|
132
|
+
}));
|
|
133
|
+
if (!mounted) return;
|
|
134
|
+
const merged = rowsByChannel.flat().sort((a, b) => b.sortAt - a.sortAt).slice(0, 200);
|
|
135
|
+
setSessions(merged);
|
|
136
|
+
} finally {
|
|
137
|
+
if (mounted) setThreadsLoading(false);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
load();
|
|
141
|
+
return () => {
|
|
142
|
+
mounted = false;
|
|
143
|
+
};
|
|
144
|
+
}, [channelsData, client]);
|
|
145
|
+
const loading = (channelsLoading || threadsLoading) && sessions.length === 0;
|
|
146
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.container, children: [
|
|
147
|
+
/* @__PURE__ */ jsx(ScrollView, { style: styles.list, contentContainerStyle: styles.listContent, contentInsetAdjustmentBehavior: "never", automaticallyAdjustContentInsets: false, contentInset: {
|
|
148
|
+
top: 0,
|
|
149
|
+
left: 0,
|
|
150
|
+
bottom: 0,
|
|
151
|
+
right: 0
|
|
152
|
+
}, scrollIndicatorInsets: {
|
|
153
|
+
top: 0,
|
|
154
|
+
left: 0,
|
|
155
|
+
bottom: 0,
|
|
156
|
+
right: 0
|
|
157
|
+
}, children: loading ? /* @__PURE__ */ jsx(View, { style: styles.emptyStateWrap, children: /* @__PURE__ */ jsx(YantraBrandLoader, {}) }) : sessions.length === 0 ? /* @__PURE__ */ jsxs(View, { style: styles.emptyStateWrap, children: [
|
|
158
|
+
/* @__PURE__ */ jsx(Text, { fontSize: "$2xl", fontWeight: "$semibold", color: "$gray900", textAlign: "center", children: "What can I do for you?" }),
|
|
159
|
+
/* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: "$gray600", textAlign: "center", children: "Ask anything to search and build with Yantra." })
|
|
160
|
+
] }) : sessions.map((session) => /* @__PURE__ */ jsx(ChatHistoryRow, { session, onSelectSession }, session.id)) }),
|
|
161
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: onCompose, style: ({
|
|
162
|
+
pressed
|
|
163
|
+
}) => [styles.fab, pressed && styles.fabPressed], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "plus", size: 28, color: "#fff" }) })
|
|
164
|
+
] });
|
|
165
|
+
}
|
|
166
|
+
const styles = StyleSheet.create({
|
|
167
|
+
container: {
|
|
168
|
+
flex: 1,
|
|
169
|
+
backgroundColor: "#fff"
|
|
170
|
+
},
|
|
171
|
+
list: {
|
|
172
|
+
flex: 1
|
|
173
|
+
},
|
|
174
|
+
listContent: {
|
|
175
|
+
paddingHorizontal: 16,
|
|
176
|
+
paddingTop: 0,
|
|
177
|
+
paddingBottom: 100,
|
|
178
|
+
gap: 6
|
|
179
|
+
},
|
|
180
|
+
emptyStateWrap: {
|
|
181
|
+
flex: 1,
|
|
182
|
+
minHeight: 420,
|
|
183
|
+
alignItems: "center",
|
|
184
|
+
justifyContent: "center",
|
|
185
|
+
gap: 10
|
|
186
|
+
},
|
|
187
|
+
item: {
|
|
188
|
+
borderRadius: 10,
|
|
189
|
+
paddingHorizontal: 12,
|
|
190
|
+
paddingVertical: 14
|
|
191
|
+
},
|
|
192
|
+
itemTop: {
|
|
193
|
+
flexDirection: "row",
|
|
194
|
+
alignItems: "center",
|
|
195
|
+
justifyContent: "space-between",
|
|
196
|
+
marginBottom: 4,
|
|
197
|
+
gap: 8
|
|
198
|
+
},
|
|
199
|
+
titleText: {
|
|
200
|
+
flex: 1,
|
|
201
|
+
minWidth: 0,
|
|
202
|
+
marginRight: 8
|
|
203
|
+
},
|
|
204
|
+
itemPressed: {
|
|
205
|
+
opacity: 0.75
|
|
206
|
+
},
|
|
207
|
+
fab: {
|
|
208
|
+
position: "absolute",
|
|
209
|
+
right: 18,
|
|
210
|
+
bottom: 28,
|
|
211
|
+
width: 56,
|
|
212
|
+
height: 56,
|
|
213
|
+
borderRadius: 28,
|
|
214
|
+
backgroundColor: "#1f2937",
|
|
215
|
+
alignItems: "center",
|
|
216
|
+
justifyContent: "center",
|
|
217
|
+
shadowColor: "#000",
|
|
218
|
+
shadowOpacity: 0.18,
|
|
219
|
+
shadowRadius: 8,
|
|
220
|
+
shadowOffset: {
|
|
221
|
+
width: 0,
|
|
222
|
+
height: 4
|
|
223
|
+
},
|
|
224
|
+
elevation: 6
|
|
225
|
+
},
|
|
226
|
+
fabPressed: {
|
|
227
|
+
opacity: 0.85
|
|
228
|
+
}
|
|
229
|
+
});export{ChatHistoryLanding as default};//# sourceMappingURL=ChatHistoryLanding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, ScrollView, StyleSheet, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { RoomType } from 'common';\nimport { useApolloClient } from '@apollo/client';\nimport { AI_ASSISTANT_CHANNELS_QUERY_VARS } from '../../../hooks/useChatApi';\nimport { MessagesDocument, useGetChannelsByUserWithLastMessageQuery } from 'common/graphql';\nimport { YantraBrandLoader } from '../../../components/YantraBrandLoader';\n\ninterface ChatHistoryLandingProps {\n onSelectSession: (channelId: string) => void;\n onCompose: () => void;\n}\n\nconst MESSAGES_PER_CHANNEL = 200;\n\nfunction truncatePreview(text: string, max = 64): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= max) return cleaned;\n return `${cleaned.slice(0, max).trim()}...`;\n}\n\nfunction stripModelCostHeader(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return normalized.replace(\n /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i,\n '',\n );\n}\n\nfunction getPostRole(post: any): string | undefined {\n return (\n post?.propsConfiguration?.content?.role ??\n post?.propsConfiguration?.contents?.role ??\n post?.props?.role ??\n undefined\n );\n}\n\nfunction sortPostsByTimeAsc(posts: any[]): any[] {\n return [...posts].sort((a, b) => {\n const ta = new Date(a?.createdAt ?? a?.updatedAt ?? 0).getTime();\n const tb = new Date(b?.createdAt ?? b?.updatedAt ?? 0).getTime();\n return ta - tb;\n });\n}\n\nfunction buildSessionsFromMessages(\n posts: any[],\n): Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> {\n const sortedAsc = sortPostsByTimeAsc(posts);\n const rows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const hasExplicitUserRole = sortedAsc.some((post) => String(getPostRole(post)).toUpperCase() === 'USER');\n\n for (let i = 0; i < sortedAsc.length; i++) {\n const current = sortedAsc[i];\n const role = getPostRole(current);\n if (hasExplicitUserRole && String(role).toUpperCase() !== 'USER') continue;\n\n const titleRaw = stripModelCostHeader(String(current?.message ?? '').trim()) || 'New Chat';\n let previewRaw = titleRaw;\n\n for (let j = i + 1; j < sortedAsc.length; j++) {\n const next = sortedAsc[j];\n const nextRole = getPostRole(next);\n if (String(nextRole).toUpperCase() === 'ASSISTANT') {\n previewRaw = stripModelCostHeader(String(next?.message ?? '').trim()) || titleRaw;\n break;\n }\n }\n\n const sessionChannelId = String(current?.channel?.id ?? current?.channel ?? '');\n if (!sessionChannelId) continue;\n\n rows.push({\n id: String(current?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(titleRaw, 44),\n preview: truncatePreview(previewRaw, 72),\n sortAt: new Date(current?.updatedAt ?? current?.createdAt ?? 0).getTime(),\n });\n }\n\n if (rows.length > 0) {\n return rows.reverse();\n }\n\n // Fallback for older rows where role metadata is absent:\n // show latest message per channel so history is never empty when posts exist.\n const fallbackRows: Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }> = [];\n const seenChannelIds = new Set<string>();\n for (let i = sortedAsc.length - 1; i >= 0; i--) {\n const post = sortedAsc[i];\n const sessionChannelId = String(post?.channel?.id ?? post?.channel ?? '');\n if (!sessionChannelId || seenChannelIds.has(sessionChannelId)) continue;\n seenChannelIds.add(sessionChannelId);\n\n const text = stripModelCostHeader(String(post?.message ?? '').trim()) || 'New Chat';\n fallbackRows.push({\n id: String(post?.id ?? `${sessionChannelId}-${i}`),\n channelId: sessionChannelId,\n title: truncatePreview(text, 44),\n preview: truncatePreview(text, 72),\n sortAt: new Date(post?.updatedAt ?? post?.createdAt ?? 0).getTime(),\n });\n }\n return fallbackRows;\n}\n\nfunction ChatHistoryRow({\n session,\n onSelectSession,\n}: {\n session: { id: string; channelId: string; title: string; preview: string; sortAt: number };\n onSelectSession: (channelId: string) => void;\n}) {\n return (\n <Pressable\n key={session.id}\n onPress={() => onSelectSession(session.channelId)}\n style={({ pressed }) => [styles.item, pressed && styles.itemPressed]}\n >\n <View style={styles.itemTop}>\n <Text style={styles.titleText} fontSize=\"$lg\" color=\"$gray900\" fontWeight=\"$semibold\" numberOfLines={1}>\n {session.title}\n </Text>\n </View>\n <Text fontSize=\"$sm\" color=\"$gray600\" numberOfLines={1}>\n {session.preview}\n </Text>\n </Pressable>\n );\n}\n\nexport default function ChatHistoryLanding({ onSelectSession, onCompose }: ChatHistoryLandingProps) {\n const client = useApolloClient();\n const { data: channelsData, loading: channelsLoading } = useGetChannelsByUserWithLastMessageQuery({\n variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\n returnPartialData: true,\n context: { cacheKey: 'channels-list' },\n });\n\n const [sessions, setSessions] = React.useState<\n Array<{ id: string; channelId: string; title: string; preview: string; sortAt: number }>\n >([]);\n const [threadsLoading, setThreadsLoading] = React.useState(false);\n\n React.useEffect(() => {\n let mounted = true;\n const load = async () => {\n const channels = (channelsData?.channelsByUser ?? []).filter(\n (c): c is NonNullable<typeof c> => Boolean(c?.id) && (!c?.type || c.type === RoomType.Aiassistant),\n );\n if (channels.length === 0) {\n if (mounted) setSessions([]);\n return;\n }\n\n setThreadsLoading(true);\n try {\n const rowsByChannel = await Promise.all(\n channels.map(async (channel) => {\n const channelId = String(channel.id);\n const result = await client.query({\n query: MessagesDocument,\n variables: {\n channelId,\n parentId: null,\n limit: MESSAGES_PER_CHANNEL,\n skip: 0,\n },\n fetchPolicy: 'cache-first',\n context: { cacheKey: 'messages-list' },\n });\n return buildSessionsFromMessages(result?.data?.messages?.data ?? []);\n }),\n );\n if (!mounted) return;\n const merged = rowsByChannel\n .flat()\n .sort((a, b) => b.sortAt - a.sortAt)\n .slice(0, 200);\n setSessions(merged);\n } finally {\n if (mounted) setThreadsLoading(false);\n }\n };\n\n load();\n return () => {\n mounted = false;\n };\n }, [channelsData, client]);\n\n const loading = (channelsLoading || threadsLoading) && sessions.length === 0;\n\n return (\n <View style={styles.container}>\n <ScrollView\n style={styles.list}\n contentContainerStyle={styles.listContent}\n contentInsetAdjustmentBehavior=\"never\"\n automaticallyAdjustContentInsets={false}\n contentInset={{ top: 0, left: 0, bottom: 0, right: 0 }}\n scrollIndicatorInsets={{ top: 0, left: 0, bottom: 0, right: 0 }}\n >\n {loading ? (\n <View style={styles.emptyStateWrap}>\n <YantraBrandLoader />\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n <Text fontSize=\"$2xl\" fontWeight=\"$semibold\" color=\"$gray900\" textAlign=\"center\">\n What can I do for you?\n </Text>\n <Text fontSize=\"$sm\" color=\"$gray600\" textAlign=\"center\">\n Ask anything to search and build with Yantra.\n </Text>\n </View>\n ) : (\n sessions.map((session) => (\n <ChatHistoryRow key={session.id} session={session} onSelectSession={onSelectSession} />\n ))\n )}\n </ScrollView>\n <Pressable onPress={onCompose} style={({ pressed }) => [styles.fab, pressed && styles.fabPressed]}>\n <MaterialCommunityIcons name=\"plus\" size={28} color=\"#fff\" />\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n },\n list: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 16,\n paddingTop: 0,\n paddingBottom: 100,\n gap: 6,\n },\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n },\n item: {\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 14,\n },\n itemTop: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n gap: 8,\n },\n titleText: {\n flex: 1,\n minWidth: 0,\n marginRight: 8,\n },\n itemPressed: {\n opacity: 0.75,\n },\n fab: {\n position: 'absolute',\n right: 18,\n bottom: 28,\n width: 56,\n height: 56,\n borderRadius: 28,\n backgroundColor: '#1f2937',\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n fabPressed: {\n opacity: 0.85,\n },\n});\n"],"names":["_a"],"mappings":"+iBAaA,MAAM,oBAAuB,GAAA,GAAA;AAC7B,SAAS,eAAA,CAAgB,IAAc,EAAA,GAAA,GAAM,EAAY,EAAA;AACvD,EAAA,MAAM,UAAU,IAAK,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,EAAE,IAAK,EAAA;AAC/C,EAAI,IAAA,OAAA,CAAQ,MAAU,IAAA,GAAA,EAAY,OAAA,OAAA;AAClC,EAAA,OAAO,GAAG,OAAQ,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA,CAAE,MAAM,CAAA,GAAA,CAAA;AACxC;AACA,SAAS,qBAAqB,OAAyB,EAAA;AACrD,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,OAAQ,CAAA,OAAA,EAAS,IAAI,CAAA;AAChD,EAAO,OAAA,UAAA,CAAW,OAAQ,CAAA,uFAAA,EAAyF,EAAE,CAAA;AACvH;AACA,SAAS,YAAY,IAA+B,EAAA;AAvBpD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwBE,EAAA,OAAA,CAAO,0DAAM,kBAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0B,YAA1B,IAAmC,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,KAAnC,aAA2C,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,kBAAA,KAAN,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,QAAA,KAA1B,mBAAoC,IAA/E,KAAA,IAAA,GAAA,EAAA,GAAA,CAAuF,kCAAM,KAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAApG,IAA4G,GAAA,EAAA,GAAA,MAAA;AACrH;AACA,SAAS,mBAAmB,KAAqB,EAAA;AAC/C,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA;AA3BnC,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4BI,IAAM,MAAA,EAAA,GAAK,IAAI,IAAA,CAAA,CAAK,EAAG,GAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,SAAA,KAAH,IAAgB,GAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAnB,KAAA,IAAA,GAAA,EAAA,GAAgC,CAAC,CAAA,CAAE,OAAQ,EAAA;AAC/D,IAAM,MAAA,EAAA,GAAK,IAAI,IAAA,CAAA,CAAK,EAAG,GAAA,CAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,SAAA,KAAH,IAAgB,GAAA,EAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAnB,KAAA,IAAA,GAAA,EAAA,GAAgC,CAAC,CAAA,CAAE,OAAQ,EAAA;AAC/D,IAAA,OAAO,EAAK,GAAA,EAAA;AAAA,GACb,CAAA;AACH;AACA,SAAS,0BAA0B,KAMhC,EAAA;AAvCH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwCE,EAAM,MAAA,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,EAAA,MAAM,OAMD,EAAC;AACN,EAAM,MAAA,mBAAA,GAAsB,SAAU,CAAA,IAAA,CAAK,CAAQ,IAAA,KAAA,MAAA,CAAO,WAAY,CAAA,IAAI,CAAC,CAAA,CAAE,WAAY,EAAA,KAAM,MAAM,CAAA;AACrG,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,SAAA,CAAU,QAAQ,CAAK,EAAA,EAAA;AACzC,IAAM,MAAA,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,IAAM,MAAA,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,IAAA,IAAI,uBAAuB,MAAO,CAAA,IAAI,CAAE,CAAA,WAAA,OAAkB,MAAQ,EAAA;AAClE,IAAM,MAAA,QAAA,GAAW,oBAAqB,CAAA,MAAA,CAAA,CAAO,EAAS,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,OAAA,KAAT,YAAoB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,UAAA;AAChF,IAAA,IAAI,UAAa,GAAA,QAAA;AACjB,IAAA,KAAA,IAAS,IAAI,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,SAAA,CAAU,QAAQ,CAAK,EAAA,EAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,MAAM,MAAA,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,MAAA,IAAI,MAAO,CAAA,QAAQ,CAAE,CAAA,WAAA,OAAkB,WAAa,EAAA;AAClD,QAAa,UAAA,GAAA,oBAAA,CAAqB,QAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,OAAA,KAAN,YAAiB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,QAAA;AACzE,QAAA;AAAA;AACF;AAEF,IAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,OAAlB,IAAwB,GAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAjC,KAAA,IAAA,GAAA,EAAA,GAA4C,EAAE,CAAA;AAC9E,IAAA,IAAI,CAAC,gBAAkB,EAAA;AACvB,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,EAAA,EAAI,QAAO,EAAS,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EAAA,KAAT,YAAe,CAAG,EAAA,gBAAgB,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA,MACpD,SAAW,EAAA,gBAAA;AAAA,MACX,KAAA,EAAO,eAAgB,CAAA,QAAA,EAAU,EAAE,CAAA;AAAA,MACnC,OAAA,EAAS,eAAgB,CAAA,UAAA,EAAY,EAAE,CAAA;AAAA,MACvC,MAAA,EAAQ,IAAI,IAAA,CAAA,CAAK,EAAS,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,SAAA,KAAT,IAAsB,GAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,SAA/B,KAAA,IAAA,GAAA,EAAA,GAA4C,CAAC,CAAA,CAAE,OAAQ;AAAA,KACzE,CAAA;AAAA;AAEH,EAAI,IAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACnB,IAAA,OAAO,KAAK,OAAQ,EAAA;AAAA;AAKtB,EAAA,MAAM,eAMD,EAAC;AACN,EAAM,MAAA,cAAA,uBAAqB,GAAY,EAAA;AACvC,EAAA,KAAA,IAAS,IAAI,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA,CAAA,IAAK,GAAG,CAAK,EAAA,EAAA;AAC9C,IAAM,MAAA,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,OAAf,IAAqB,GAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAA3B,KAAA,IAAA,GAAA,EAAA,GAAsC,EAAE,CAAA;AACxE,IAAA,IAAI,CAAC,gBAAA,IAAoB,cAAe,CAAA,GAAA,CAAI,gBAAgB,CAAG,EAAA;AAC/D,IAAA,cAAA,CAAe,IAAI,gBAAgB,CAAA;AACnC,IAAM,MAAA,IAAA,GAAO,oBAAqB,CAAA,MAAA,CAAA,CAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,OAAA,KAAN,YAAiB,EAAE,CAAA,CAAE,IAAK,EAAC,CAAK,IAAA,UAAA;AACzE,IAAA,YAAA,CAAa,IAAK,CAAA;AAAA,MAChB,EAAA,EAAI,QAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,EAAA,KAAN,YAAY,CAAG,EAAA,gBAAgB,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA,MACjD,SAAW,EAAA,gBAAA;AAAA,MACX,KAAA,EAAO,eAAgB,CAAA,IAAA,EAAM,EAAE,CAAA;AAAA,MAC/B,OAAA,EAAS,eAAgB,CAAA,IAAA,EAAM,EAAE,CAAA;AAAA,MACjC,MAAA,EAAQ,IAAI,IAAA,CAAA,CAAK,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAzB,KAAA,IAAA,GAAA,EAAA,GAAsC,CAAC,CAAA,CAAE,OAAQ;AAAA,KACnE,CAAA;AAAA;AAEH,EAAO,OAAA,YAAA;AACT;AACA,SAAS,cAAe,CAAA;AAAA,EACtB,OAAA;AAAA,EACA;AACF,CASG,EAAA;AACD,EAAO,uBAAA,IAAA,CAAC,aAA2B,OAAS,EAAA,MAAM,gBAAgB,OAAQ,CAAA,SAAS,CAAG,EAAA,KAAA,EAAO,CAAC;AAAA,IAC5F;AAAA,QACI,CAAC,MAAA,CAAO,MAAM,OAAW,IAAA,MAAA,CAAO,WAAW,CACvC,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,SAChB,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,MAAO,CAAA,SAAA,EAAW,UAAS,KAAM,EAAA,KAAA,EAAM,YAAW,UAAW,EAAA,WAAA,EAAY,eAAe,CAChG,EAAA,QAAA,EAAA,OAAA,CAAQ,OACb,CACJ,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,aAAA,EAAe,CAChD,EAAA,QAAA,EAAA,OAAA,CAAQ,OACb,EAAA;AAAA,GAAA,EAAA,EAVa,QAAQ,EAWzB,CAAA;AACR;AACA,SAAwB,kBAAmB,CAAA;AAAA,EACzC,eAAA;AAAA,EACA;AACF,CAA4B,EAAA;AAC1B,EAAA,MAAM,SAAS,eAAgB,EAAA;AAC/B,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA,YAAA;AAAA,IACN,OAAS,EAAA;AAAA,MACP,wCAAyC,CAAA;AAAA,IAC3C,SAAW,EAAA,gCAAA;AAAA,IACX,WAAa,EAAA,mBAAA;AAAA,IACb,WAAa,EAAA,KAAA;AAAA,IACb,2BAA6B,EAAA,IAAA;AAAA,IAC7B,iBAAmB,EAAA,IAAA;AAAA,IACnB,OAAS,EAAA;AAAA,MACP,QAAU,EAAA;AAAA;AACZ,GACD,CAAA;AACD,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,KAAM,CAAA,QAAA,CAMlC,EAAE,CAAA;AACN,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAChE,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAA,MAAM,OAAO,YAAY;AA7J7B,MAAA,IAAA,EAAA;AA8JM,MAAA,MAAM,aAAY,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAA,cAAA,KAAd,YAAgC,EAAC,EAAG,OAAO,CAAC,CAAA,KAAkC,QAAQ,CAAG,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAA,EAAE,MAAM,EAAC,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAQ,CAAE,CAAA,IAAA,KAAS,SAAS,WAAY,CAAA,CAAA;AAC/J,MAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,QAAI,IAAA,OAAA,EAAqB,WAAA,CAAA,EAAE,CAAA;AAC3B,QAAA;AAAA;AAEF,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAI,IAAA;AACF,QAAA,MAAM,gBAAgB,MAAM,OAAA,CAAQ,IAAI,QAAS,CAAA,GAAA,CAAI,OAAM,OAAW,KAAA;AArK9E,UAAA,IAAAA,GAAA,EAAA,EAAA,EAAA,EAAA;AAsKU,UAAM,MAAA,SAAA,GAAY,MAAO,CAAA,OAAA,CAAQ,EAAE,CAAA;AACnC,UAAM,MAAA,MAAA,GAAS,MAAM,MAAA,CAAO,KAAM,CAAA;AAAA,YAChC,KAAO,EAAA,gBAAA;AAAA,YACP,SAAW,EAAA;AAAA,cACT,SAAA;AAAA,cACA,QAAU,EAAA,IAAA;AAAA,cACV,KAAO,EAAA,oBAAA;AAAA,cACP,IAAM,EAAA;AAAA,aACR;AAAA,YACA,WAAa,EAAA,aAAA;AAAA,YACb,OAAS,EAAA;AAAA,cACP,QAAU,EAAA;AAAA;AACZ,WACD,CAAA;AACD,UAAA,OAAO,yBAA0B,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAAA,GAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,IAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAc,CAAA,QAAA,KAAd,IAAwB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,KAAxB,IAAgC,GAAA,EAAA,GAAA,EAAE,CAAA;AAAA,SACpE,CAAC,CAAA;AACF,QAAA,IAAI,CAAC,OAAS,EAAA;AACd,QAAA,MAAM,MAAS,GAAA,aAAA,CAAc,IAAK,EAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAM,CAAE,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA;AACpF,QAAA,WAAA,CAAY,MAAM,CAAA;AAAA,OAClB,SAAA;AACA,QAAI,IAAA,OAAA,oBAA2B,KAAK,CAAA;AAAA;AACtC,KACF;AACA,IAAK,IAAA,EAAA;AACL,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,MAAM,CAAC,CAAA;AACzB,EAAA,MAAM,OAAW,GAAA,CAAA,eAAA,IAAmB,cAAmB,KAAA,QAAA,CAAS,MAAW,KAAA,CAAA;AAC3E,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,SACjB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,KAAO,EAAA,MAAA,CAAO,IAAM,EAAA,qBAAA,EAAuB,MAAO,CAAA,WAAA,EAAa,8BAA+B,EAAA,OAAA,EAAQ,gCAAkC,EAAA,KAAA,EAAO,YAAc,EAAA;AAAA,MAC/K,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,OACN,qBAAuB,EAAA;AAAA,MACxB,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA;AAAA,OAEI,QAAU,EAAA,OAAA,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,gBACvB,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA,EAAkB,CACvB,EAAA,CAAA,GAAU,SAAS,MAAW,KAAA,CAAA,wBAAK,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,cAClD,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,UAAS,MAAO,EAAA,UAAA,EAAW,aAAY,KAAM,EAAA,UAAA,EAAW,SAAU,EAAA,QAAA,EAAS,QAEjF,EAAA,wBAAA,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,SAAA,EAAU,UAAS,QAEzD,EAAA,+CAAA,EAAA;AAAA,KACJ,EAAA,CAAA,GAAU,QAAS,CAAA,GAAA,CAAI,CAAW,OAAA,qBAAA,GAAA,CAAC,cAAgC,EAAA,EAAA,OAAA,EAAkB,eAA9B,EAAA,EAAA,OAAA,CAAQ,EAAwD,CAAE,CACjI,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,SAAA,EAAW,OAAO,CAAC;AAAA,MAC7C;AAAA,UACI,CAAC,MAAA,CAAO,GAAK,EAAA,OAAA,IAAW,OAAO,UAAU,CAAA,EACnC,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,MAAO,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,QAAO,CAC/D,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA,GACR;AAAA,EACA,WAAa,EAAA;AAAA,IACX,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,CAAA;AAAA,IACZ,aAAe,EAAA,GAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,IAAM,EAAA,CAAA;AAAA,IACN,SAAW,EAAA,GAAA;AAAA,IACX,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,eAAA;AAAA,IAChB,YAAc,EAAA,CAAA;AAAA,IACd,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA;AAAA,GACf;AAAA,EACA,WAAa,EAAA;AAAA,IACX,OAAS,EAAA;AAAA,GACX;AAAA,EACA,GAAK,EAAA;AAAA,IACH,QAAU,EAAA,UAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,eAAiB,EAAA,SAAA;AAAA,IACjB,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,WAAa,EAAA,MAAA;AAAA,IACb,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,CAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,OAAS,EAAA;AAAA;AAEb,CAAC,CAAA"}
|