@adminide-stack/yantra-mobile 12.0.69-alpha.12 → 12.0.69-alpha.15
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/components/GatewayConnector/GatewayConnector.js +2 -2
- package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +8 -1
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +2 -2
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/audio-input/MicErrorBoundary.js +2 -2
- package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +308 -0
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
- package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
- package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
- package/lib/features/canvas/CanvasChatResultCard.js +113 -0
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
- package/lib/features/canvas/CanvasExperience.js +859 -0
- package/lib/features/canvas/CanvasExperience.js.map +1 -0
- package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
- package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
- package/lib/features/canvas/CanvasLooksPanel.js +184 -0
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +138 -0
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
- package/lib/features/canvas/CanvasToolDock.js +423 -0
- package/lib/features/canvas/CanvasToolDock.js.map +1 -0
- package/lib/features/canvas/FrameExtractorExperience.js +242 -0
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +491 -0
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
- package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
- package/lib/features/canvas/MoodboardExperience.js +205 -0
- package/lib/features/canvas/MoodboardExperience.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +929 -0
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
- package/lib/features/canvas/PromoContextFields.js +150 -0
- package/lib/features/canvas/PromoContextFields.js.map +1 -0
- package/lib/features/canvas/SetStudioExperience.js +323 -0
- package/lib/features/canvas/SetStudioExperience.js.map +1 -0
- package/lib/features/canvas/VideoClipsExperience.js +175 -0
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditExperience.js +824 -0
- package/lib/features/canvas/VideoEditExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditorExperience.js +3050 -0
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
- package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
- package/lib/features/canvas/aiEdit.js +53 -0
- package/lib/features/canvas/aiEdit.js.map +1 -0
- package/lib/features/canvas/canvasAgentChat.js +76 -0
- package/lib/features/canvas/canvasAgentChat.js.map +1 -0
- package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
- package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
- package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
- package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
- package/lib/features/canvas/canvasChatDisplay.js +38 -0
- package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
- package/lib/features/canvas/canvasChatTemplates.js +219 -0
- package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
- package/lib/features/canvas/canvasCore.js +138 -1
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +224 -0
- package/lib/features/canvas/canvasEditOps.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +187 -0
- package/lib/features/canvas/canvasTasks.js.map +1 -0
- package/lib/features/canvas/designPromptTemplates.js +3084 -0
- package/lib/features/canvas/designPromptTemplates.js.map +1 -0
- package/lib/features/canvas/editTools.js +54 -0
- package/lib/features/canvas/editTools.js.map +1 -0
- package/lib/features/canvas/extendVideo.js +5 -0
- package/lib/features/canvas/extendVideo.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +33 -0
- package/lib/features/canvas/frameExtract.js.map +1 -0
- package/lib/features/canvas/generationModels.js +201 -0
- package/lib/features/canvas/generationModels.js.map +1 -0
- package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
- package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
- package/lib/features/canvas/influencer/productReel.js +72 -0
- package/lib/features/canvas/influencer/productReel.js.map +1 -0
- package/lib/features/canvas/influencer/reelPlan.js +159 -0
- package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
- package/lib/features/canvas/moodboardCore.js +13 -0
- package/lib/features/canvas/moodboardCore.js.map +1 -0
- package/lib/features/canvas/promoProjectImport.js +99 -0
- package/lib/features/canvas/promoProjectImport.js.map +1 -0
- package/lib/features/canvas/promoVideo.js +312 -0
- package/lib/features/canvas/promoVideo.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
- package/lib/features/canvas/sessionIdentity.js +28 -1
- package/lib/features/canvas/sessionIdentity.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +133 -0
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
- package/lib/features/canvas/set/cameraPath.js +194 -0
- package/lib/features/canvas/set/cameraPath.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +24 -0
- package/lib/features/canvas/set/setProject.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +184 -0
- package/lib/features/canvas/storageLibrary.js.map +1 -0
- package/lib/features/canvas/studioCatalog.js +129 -0
- package/lib/features/canvas/studioCatalog.js.map +1 -0
- package/lib/features/canvas/studioLooks.js +189 -0
- package/lib/features/canvas/studioLooks.js.map +1 -0
- package/lib/features/canvas/surfaceIndex.js +63 -1
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateImport/invideoNative.js +221 -0
- package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
- package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
- package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
- package/lib/features/canvas/templateImport/renderConfig.js +93 -0
- package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
- package/lib/features/canvas/video3d.js +109 -0
- package/lib/features/canvas/video3d.js.map +1 -0
- package/lib/features/canvas/videoClips.js +42 -0
- package/lib/features/canvas/videoClips.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +346 -0
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
- package/lib/features/canvas/videoEditor/filters.js +41 -0
- package/lib/features/canvas/videoEditor/filters.js.map +1 -0
- package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
- package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
- package/lib/features/canvas/videoRenderer.js +8 -0
- package/lib/features/canvas/videoRenderer.js.map +1 -0
- package/lib/features/canvas/withRemoteSafeArea.js +2 -2
- package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
- package/lib/features/characters/characterStudioProps.js +14 -0
- package/lib/features/characters/characterStudioProps.js.map +1 -0
- package/lib/features/design/DesignEditorExperience.js +643 -0
- package/lib/features/design/DesignEditorExperience.js.map +1 -0
- package/lib/features/design/DesignExperience.js +444 -0
- package/lib/features/design/DesignExperience.js.map +1 -0
- package/lib/features/design/designCore.js +298 -0
- package/lib/features/design/designCore.js.map +1 -0
- package/lib/features/design/designIndex.js +150 -0
- package/lib/features/design/designIndex.js.map +1 -0
- package/lib/features/design/exportDesign.js +133 -0
- package/lib/features/design/exportDesign.js.map +1 -0
- package/lib/features/job-search/ApplicationsPanel.js +907 -0
- package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
- package/lib/features/job-search/ContactsPanel.js +627 -0
- package/lib/features/job-search/ContactsPanel.js.map +1 -0
- package/lib/features/job-search/InsightsPanel.js +299 -0
- package/lib/features/job-search/InsightsPanel.js.map +1 -0
- package/lib/features/job-search/InterviewPanel.js +637 -0
- package/lib/features/job-search/InterviewPanel.js.map +1 -0
- package/lib/features/job-search/JdPastePrompt.js +130 -0
- package/lib/features/job-search/JdPastePrompt.js.map +1 -0
- package/lib/features/job-search/JobCard.js +199 -0
- package/lib/features/job-search/JobCard.js.map +1 -0
- package/lib/features/job-search/JobDetailSheet.js +255 -0
- package/lib/features/job-search/JobDetailSheet.js.map +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
- package/lib/features/job-search/JobSearchExperience.js +1324 -0
- package/lib/features/job-search/JobSearchExperience.js.map +1 -0
- package/lib/features/job-search/JobSearchLocationField.js +231 -0
- package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
- package/lib/features/job-search/ProfilePanel.js +679 -0
- package/lib/features/job-search/ProfilePanel.js.map +1 -0
- package/lib/features/job-search/RepliesPanel.js +344 -0
- package/lib/features/job-search/RepliesPanel.js.map +1 -0
- package/lib/features/job-search/SavedPanel.js +297 -0
- package/lib/features/job-search/SavedPanel.js.map +1 -0
- package/lib/features/job-search/chat/widgetContent.js +29 -0
- package/lib/features/job-search/chat/widgetContent.js.map +1 -0
- package/lib/features/job-search/cvText.js +91 -0
- package/lib/features/job-search/cvText.js.map +1 -0
- package/lib/features/job-search/jobAgentSwipe.js +7 -0
- package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
- package/lib/features/job-search/jobSearchClient.js +184 -0
- package/lib/features/job-search/jobSearchClient.js.map +1 -0
- package/lib/features/job-search/jobSearchExec.js +14 -0
- package/lib/features/job-search/jobSearchExec.js.map +1 -0
- package/lib/features/job-search/jobSearchRuntime.js +50 -0
- package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
- package/lib/features/job-search/jobSearchTheme.js +44 -0
- package/lib/features/job-search/jobSearchTheme.js.map +1 -0
- package/lib/features/job-search/savedJobs.js +85 -0
- package/lib/features/job-search/savedJobs.js.map +1 -0
- package/lib/features/job-search/searchHistory.js +117 -0
- package/lib/features/job-search/searchHistory.js.map +1 -0
- package/lib/features/job-search/types.js +36 -0
- package/lib/features/job-search/types.js.map +1 -0
- package/lib/features/job-search/useJobSearchSession.js +558 -0
- package/lib/features/job-search/useJobSearchSession.js.map +1 -0
- package/lib/features/messaging/ChatComponents.js +529 -0
- package/lib/features/messaging/ChatComponents.js.map +1 -0
- package/lib/features/messaging/ChatInviteDeepLink.js +92 -0
- package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
- package/lib/features/messaging/ContactsScreen.js +230 -0
- package/lib/features/messaging/ContactsScreen.js.map +1 -0
- package/lib/features/messaging/ConversationListScreen.js +144 -0
- package/lib/features/messaging/ConversationListScreen.js.map +1 -0
- package/lib/features/messaging/MessageActions.js +283 -0
- package/lib/features/messaging/MessageActions.js.map +1 -0
- package/lib/features/messaging/NativeChatExperience.js +173 -0
- package/lib/features/messaging/NativeChatExperience.js.map +1 -0
- package/lib/features/messaging/RegistrationScreen.js +7 -7
- package/lib/features/messaging/RegistrationScreen.js.map +1 -1
- package/lib/features/messaging/ThreadScreen.js +215 -0
- package/lib/features/messaging/ThreadScreen.js.map +1 -0
- package/lib/features/messaging/chatInviteLink.js +52 -0
- package/lib/features/messaging/chatInviteLink.js.map +1 -0
- package/lib/features/messaging/chatModel.js +278 -0
- package/lib/features/messaging/chatModel.js.map +1 -0
- package/lib/features/messaging/chatOperations.js +107 -1
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/emojiCatalog.js +36 -0
- package/lib/features/messaging/emojiCatalog.js.map +1 -0
- package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
- package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
- package/lib/features/messaging/phoneNumbers.js +52 -1
- package/lib/features/messaging/phoneNumbers.js.map +1 -1
- package/lib/features/messaging/sha256.js +68 -0
- package/lib/features/messaging/sha256.js.map +1 -0
- package/lib/features/messaging/useChatData.js +421 -0
- package/lib/features/messaging/useChatData.js.map +1 -0
- package/lib/features/messaging/useContactMatches.js +231 -0
- package/lib/features/messaging/useContactMatches.js.map +1 -0
- package/lib/features/messaging/usePhoneVerification.js +6 -5
- package/lib/features/messaging/usePhoneVerification.js.map +1 -1
- package/lib/features/messaging/yantraChatOrg.js +8 -3
- package/lib/features/messaging/yantraChatOrg.js.map +1 -1
- package/lib/features/resume/AnnotateModal.js +100 -0
- package/lib/features/resume/AnnotateModal.js.map +1 -0
- package/lib/features/resume/AnnotationBar.js +69 -0
- package/lib/features/resume/AnnotationBar.js.map +1 -0
- package/lib/features/resume/ExportSheet.js +105 -0
- package/lib/features/resume/ExportSheet.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +95 -0
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
- package/lib/features/resume/ResumeEditor.js +676 -0
- package/lib/features/resume/ResumeEditor.js.map +1 -0
- package/lib/features/resume/ResumeExperience.js +235 -0
- package/lib/features/resume/ResumeExperience.js.map +1 -0
- package/lib/features/resume/ResumeListPanel.js +262 -0
- package/lib/features/resume/ResumeListPanel.js.map +1 -0
- package/lib/features/resume/ResumeToolbar.js +236 -0
- package/lib/features/resume/ResumeToolbar.js.map +1 -0
- package/lib/features/resume/annotations.js +17 -0
- package/lib/features/resume/annotations.js.map +1 -0
- package/lib/features/resume/documentCss.js +52 -0
- package/lib/features/resume/documentCss.js.map +1 -0
- package/lib/features/resume/draft.js +89 -0
- package/lib/features/resume/draft.js.map +1 -0
- package/lib/features/resume/exportResume.js +43 -0
- package/lib/features/resume/exportResume.js.map +1 -0
- package/lib/features/resume/pickResumePhoto.js +22 -0
- package/lib/features/resume/pickResumePhoto.js.map +1 -0
- package/lib/features/resume/renderResume.js +121 -0
- package/lib/features/resume/renderResume.js.map +1 -0
- package/lib/features/resume/resumeClient.js +69 -0
- package/lib/features/resume/resumeClient.js.map +1 -0
- package/lib/features/resume/resumeExec.js +14 -0
- package/lib/features/resume/resumeExec.js.map +1 -0
- package/lib/features/resume/resumeIndex.js +244 -0
- package/lib/features/resume/resumeIndex.js.map +1 -0
- package/lib/features/resume/resumeRuntime.js +50 -0
- package/lib/features/resume/resumeRuntime.js.map +1 -0
- package/lib/features/resume/resumeTheme.js +34 -0
- package/lib/features/resume/resumeTheme.js.map +1 -0
- package/lib/features/resume/resumeToolbox.js +49 -0
- package/lib/features/resume/resumeToolbox.js.map +1 -0
- package/lib/features/resume/templates.js +90 -0
- package/lib/features/resume/templates.js.map +1 -0
- package/lib/features/resume/types.js +10 -0
- package/lib/features/resume/types.js.map +1 -0
- package/lib/features/resume/useResumeSession.js +183 -0
- package/lib/features/resume/useResumeSession.js.map +1 -0
- package/lib/features/shopping/DealsPanel.js +254 -0
- package/lib/features/shopping/DealsPanel.js.map +1 -0
- package/lib/features/shopping/HistoryPanel.js +147 -0
- package/lib/features/shopping/HistoryPanel.js.map +1 -0
- package/lib/features/shopping/OrdersPanel.js +157 -0
- package/lib/features/shopping/OrdersPanel.js.map +1 -0
- package/lib/features/shopping/ProductCard.js +326 -0
- package/lib/features/shopping/ProductCard.js.map +1 -0
- package/lib/features/shopping/ProductDetailSheet.js +313 -0
- package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
- package/lib/features/shopping/ProductFilterBar.js +153 -0
- package/lib/features/shopping/ProductFilterBar.js.map +1 -0
- package/lib/features/shopping/ProductPhoto.js +27 -0
- package/lib/features/shopping/ProductPhoto.js.map +1 -0
- package/lib/features/shopping/SavedPanel.js +139 -0
- package/lib/features/shopping/SavedPanel.js.map +1 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
- package/lib/features/shopping/ShoppingExperience.js +888 -0
- package/lib/features/shopping/ShoppingExperience.js.map +1 -0
- package/lib/features/shopping/TrendingSections.js +199 -0
- package/lib/features/shopping/TrendingSections.js.map +1 -0
- package/lib/features/shopping/WatchlistPanel.js +148 -0
- package/lib/features/shopping/WatchlistPanel.js.map +1 -0
- package/lib/features/shopping/catalog.js +238 -0
- package/lib/features/shopping/catalog.js.map +1 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
- package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
- package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
- package/lib/features/shopping/chat/widgetContent.js +233 -0
- package/lib/features/shopping/chat/widgetContent.js.map +1 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
- package/lib/features/shopping/productImage.js +42 -0
- package/lib/features/shopping/productImage.js.map +1 -0
- package/lib/features/shopping/savedProducts.js +84 -0
- package/lib/features/shopping/savedProducts.js.map +1 -0
- package/lib/features/shopping/services/catalogActions.js +166 -0
- package/lib/features/shopping/services/catalogActions.js.map +1 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
- package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
- package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
- package/lib/features/shopping/services/productAvailability.js +25 -0
- package/lib/features/shopping/services/productAvailability.js.map +1 -0
- package/lib/features/shopping/services/productFilters.js +72 -0
- package/lib/features/shopping/services/productFilters.js.map +1 -0
- package/lib/features/shopping/services/retailerUrl.js +75 -0
- package/lib/features/shopping/services/retailerUrl.js.map +1 -0
- package/lib/features/shopping/services/shoppingChatReply.js +46 -0
- package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
- package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
- package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
- package/lib/features/shopping/shopAgentSwipe.js +7 -0
- package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
- package/lib/features/shopping/shoppingCart.js +116 -0
- package/lib/features/shopping/shoppingCart.js.map +1 -0
- package/lib/features/shopping/shoppingExec.js +14 -0
- package/lib/features/shopping/shoppingExec.js.map +1 -0
- package/lib/features/shopping/shoppingHistoryStore.js +176 -0
- package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
- package/lib/features/shopping/shoppingRuntime.js +63 -0
- package/lib/features/shopping/shoppingRuntime.js.map +1 -0
- package/lib/features/shopping/timeAgo.js +14 -0
- package/lib/features/shopping/timeAgo.js.map +1 -0
- package/lib/features/shopping/useShoppingSearch.js +262 -0
- package/lib/features/shopping/useShoppingSearch.js.map +1 -0
- package/lib/features/travel/BookHeaderGlow.js +48 -0
- package/lib/features/travel/BookHeaderGlow.js.map +1 -0
- package/lib/features/travel/BookingsPanel.js +29 -0
- package/lib/features/travel/BookingsPanel.js.map +1 -0
- package/lib/features/travel/DiscoverPanel.js +155 -0
- package/lib/features/travel/DiscoverPanel.js.map +1 -0
- package/lib/features/travel/FlightCompareBar.js +86 -0
- package/lib/features/travel/FlightCompareBar.js.map +1 -0
- package/lib/features/travel/FlightDealsBoard.js +100 -0
- package/lib/features/travel/FlightDealsBoard.js.map +1 -0
- package/lib/features/travel/HistoryPanel.js +82 -0
- package/lib/features/travel/HistoryPanel.js.map +1 -0
- package/lib/features/travel/PopularDestinations.js +144 -0
- package/lib/features/travel/PopularDestinations.js.map +1 -0
- package/lib/features/travel/SavedPanel.js +27 -0
- package/lib/features/travel/SavedPanel.js.map +1 -0
- package/lib/features/travel/TravelAgentChatPane.js +303 -0
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
- package/lib/features/travel/TravelBookHero.js +425 -0
- package/lib/features/travel/TravelBookHero.js.map +1 -0
- package/lib/features/travel/TravelDatesField.js +234 -0
- package/lib/features/travel/TravelDatesField.js.map +1 -0
- package/lib/features/travel/TravelDetailSheet.js +106 -0
- package/lib/features/travel/TravelDetailSheet.js.map +1 -0
- package/lib/features/travel/TravelExperience.js +624 -0
- package/lib/features/travel/TravelExperience.js.map +1 -0
- package/lib/features/travel/TravelGuestsField.js +85 -0
- package/lib/features/travel/TravelGuestsField.js.map +1 -0
- package/lib/features/travel/TravelLanding.js +318 -0
- package/lib/features/travel/TravelLanding.js.map +1 -0
- package/lib/features/travel/TravelLocationField.js +179 -0
- package/lib/features/travel/TravelLocationField.js.map +1 -0
- package/lib/features/travel/TravelPropertyCard.js +266 -0
- package/lib/features/travel/TravelPropertyCard.js.map +1 -0
- package/lib/features/travel/TravelPropertyPhoto.js +22 -0
- package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
- package/lib/features/travel/TravelRailFlyout.js +79 -0
- package/lib/features/travel/TravelRailFlyout.js.map +1 -0
- package/lib/features/travel/TravelResultsMap.js +126 -0
- package/lib/features/travel/TravelResultsMap.js.map +1 -0
- package/lib/features/travel/WorkspacePanel.js +148 -0
- package/lib/features/travel/WorkspacePanel.js.map +1 -0
- package/lib/features/travel/appNav.js +244 -0
- package/lib/features/travel/appNav.js.map +1 -0
- package/lib/features/travel/calendarDays.js +50 -0
- package/lib/features/travel/calendarDays.js.map +1 -0
- package/lib/features/travel/catalog.js +72 -0
- package/lib/features/travel/catalog.js.map +1 -0
- package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
- package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
- package/lib/features/travel/chat/widgetContent.js +107 -0
- package/lib/features/travel/chat/widgetContent.js.map +1 -0
- package/lib/features/travel/flightDeals.js +65 -0
- package/lib/features/travel/flightDeals.js.map +1 -0
- package/lib/features/travel/mapCoordinates.js +36 -0
- package/lib/features/travel/mapCoordinates.js.map +1 -0
- package/lib/features/travel/parseTravelIntent.js +303 -0
- package/lib/features/travel/parseTravelIntent.js.map +1 -0
- package/lib/features/travel/savedStays.js +66 -0
- package/lib/features/travel/savedStays.js.map +1 -0
- package/lib/features/travel/services/flightDealsBoard.js +111 -0
- package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
- package/lib/features/travel/services/geocodeLocation.js +79 -0
- package/lib/features/travel/services/geocodeLocation.js.map +1 -0
- package/lib/features/travel/services/placePredictions.js +113 -0
- package/lib/features/travel/services/placePredictions.js.map +1 -0
- package/lib/features/travel/services/resolveOriginCity.js +27 -0
- package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
- package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
- package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
- package/lib/features/travel/services/travelFlightSearch.js +289 -0
- package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
- package/lib/features/travel/services/travelPropertySearch.js +377 -0
- package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
- package/lib/features/travel/travelAgentSwipe.js +7 -0
- package/lib/features/travel/travelAgentSwipe.js.map +1 -0
- package/lib/features/travel/travelExec.js +14 -0
- package/lib/features/travel/travelExec.js.map +1 -0
- package/lib/features/travel/travelHistoryStore.js +108 -0
- package/lib/features/travel/travelHistoryStore.js.map +1 -0
- package/lib/features/travel/travelRuntime.js +62 -0
- package/lib/features/travel/travelRuntime.js.map +1 -0
- package/lib/features/travel/types.js +9 -0
- package/lib/features/travel/types.js.map +1 -0
- package/lib/features/travel/useTravelSearch.js +330 -0
- package/lib/features/travel/useTravelSearch.js.map +1 -0
- package/lib/features/travel/workspaceContent.js +548 -0
- package/lib/features/travel/workspaceContent.js.map +1 -0
- package/lib/hooks/useObtainSystemToken.js +23 -5
- package/lib/hooks/useObtainSystemToken.js.map +1 -1
- package/lib/hooks/webViewRetentionPolicy.js +1 -0
- package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/ChatNative/index.js +8 -2
- package/lib/screens/ChatNative/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +3 -3
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
- package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
- package/lib/services/brainQuickReply.js +38 -1
- package/lib/services/brainQuickReply.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Pressable,\n RefreshControl,\n SectionList,\n StyleSheet,\n View,\n useColorScheme,\n useWindowDimensions,\n type ViewStyle,\n} from 'react-native';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport {\n HISTORY_PAGE_SIZE,\n chatHistorySessionsFromChannels,\n chatHistorySessionsFromMessages,\n enrichHistorySessionsWithUserPrompts,\n fetchHistorySessionsForChannels,\n getChatHistoryMessagesQueryVariables,\n getHistoryChannelsQueryVariables,\n seedRememberedHistoryFromSessions,\n subscribeRememberedHistory,\n useChatHistorySessionsFromChannels,\n useChatHistorySessionsFromMessages,\n type ChatHistoryMode,\n type ChatHistorySession,\n} from '../../../hooks/useChatApi';\nimport { useApolloClient } from '@apollo/client';\nimport { GetChannelsByUserWithLastMessageDocument, MessagesDocument } from 'common/graphql';\nimport { usePrerequisiteIds } from '../../../hooks/usePrerequisiteIds';\nimport { useHistoryRunWatcher } from '../../../hooks/useHistoryRunWatcher';\nimport { mobileTokens } from '../../../theme/mobileTokens';\nimport {\n hydrateChatHistorySnapshot,\n peekChatHistorySnapshot,\n peekChatHistorySnapshotOrgName,\n persistChatHistorySnapshot,\n subscribeChatHistorySnapshot,\n} from '../../../features/chat/chatHistorySnapshot';\n\n/**\n * Chat history list for mobile.\n *\n * Data: `useGetChannelsByUserWithLastMessageQuery` returning one row per channel\n * with `lastMessage` carrying the parent user prompt and the assistant reply.\n *\n * Layout: Manus-style two-line row — 40×40 leading mode tile, **line 1** =\n * `lastMessage.propsConfiguration.contents.parent.message` (user prompt),\n * **line 2** = `lastMessage.message` (latest post body, including agent errors\n * such as lines starting with ⚠), right-aligned short date. Indigo-tinted\n * neutrals so the surface stays in the Yantra brand register.\n *\n * Mode tile carries real information (chat vs deep-search), not decoration —\n * different modes get different glyphs and tints.\n */\ninterface ChatHistoryLandingProps {\n /**\n * `mode` is derived per-row via `detectMode(channel)`. Build sessions open\n * Web Builder; chat / deep-search open Chat.\n */\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n /** Kept in the contract; not surfaced here — new-chat lives in the screen header. */\n onCompose: () => void;\n /** Route org slug when known — avoids waiting on `usePrerequisiteIds` to hit the cache. */\n orgName?: string | null;\n}\n\ninterface SessionRow extends ChatHistorySession {\n id: string;\n /** Pre-truncated title for one-line render. */\n titleForRender: string;\n /** Pre-truncated preview for one-line render (empty if suppressed upstream). */\n previewForRender: string;\n /** Cached unix-ms for bucketing / sorting. */\n sortAt: number;\n}\n\ninterface SessionSection {\n key: 'today' | 'yesterday' | 'week' | 'earlier';\n title: string;\n data: SessionRow[];\n}\n\nfunction truncate(text: string, max = 96): 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\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction relativeTime(ts: number, now: number): string {\n const deltaMs = now - ts;\n if (deltaMs < 60_000) return 'now';\n const minutes = Math.floor(deltaMs / 60_000);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) {\n const d = new Date(ts);\n return WEEKDAYS[d.getDay()] ?? `${days}d`;\n }\n /**\n * 7d+: numeric short date (e.g. \"2/18\" matching the Manus reference). Year only\n * appears when crossing into a previous year, to keep the right column compact.\n */\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const m = d.getMonth() + 1;\n const day = d.getDate();\n return sameYear ? `${m}/${day}` : `${m}/${day}/${String(d.getFullYear()).slice(2)}`;\n}\n\nfunction bucketFor(ts: number, now: number): SessionSection['key'] {\n const a = new Date(ts);\n const b = new Date(now);\n const startOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const today = startOf(b);\n const yesterday = today - 24 * 60 * 60 * 1000;\n const weekAgo = today - 7 * 24 * 60 * 60 * 1000;\n const tsDay = startOf(a);\n if (tsDay >= today) return 'today';\n if (tsDay >= yesterday) return 'yesterday';\n if (tsDay >= weekAgo) return 'week';\n return 'earlier';\n}\n\nfunction buildSections(rows: SessionRow[], now: number): SessionSection[] {\n const buckets: Record<SessionSection['key'], SessionRow[]> = {\n today: [],\n yesterday: [],\n week: [],\n earlier: [],\n };\n for (const row of rows) {\n buckets[bucketFor(row.sortAt, now)].push(row);\n }\n const out: SessionSection[] = [];\n if (buckets.today.length) out.push({ key: 'today', title: 'TODAY', data: buckets.today });\n if (buckets.yesterday.length) out.push({ key: 'yesterday', title: 'YESTERDAY', data: buckets.yesterday });\n if (buckets.week.length) out.push({ key: 'week', title: 'PREVIOUS 7 DAYS', data: buckets.week });\n if (buckets.earlier.length) out.push({ key: 'earlier', title: 'EARLIER', data: buckets.earlier });\n return out;\n}\n\n/**\n * Theme tokens.\n *\n * Color strategy: Monochrome ink. Chrome (section labels, chat tile, load-more\n * pill, end-of-list dot, press wash, refresh spinner) is rendered in tinted\n * neutrals so the only real color on the screen is the deep-search amber —\n * which then reliably signals a mode, not decoration. Neutrals carry chroma\n * 0.005–0.01 toward the brand hue (no pure `#fff` / `#000`).\n */\ninterface ThemeTokens {\n bg: string;\n surface: string;\n title: string;\n preview: string;\n meta: string;\n muted: string;\n divider: string;\n sectionLabel: string;\n /** Mode tile (chat) — neutral ink on neutral fill. */\n tileChatBg: string;\n tileChatIcon: string;\n /** Mode tile (deep-search) — amber kept as the one real mode color. */\n tileSearchBg: string;\n tileSearchIcon: string;\n /** Mode tile (build / Web Builder) — indigo, same accent as the composer lightbulb. */\n tileBuildBg: string;\n tileBuildIcon: string;\n pressed: string;\n loadMoreText: string;\n loadMoreBorder: string;\n loadMoreBg: string;\n refreshTint: string;\n endDot: string;\n /**\n * Empty-state mark — circular soft-neutral disk holding a chat glyph.\n * Matches the web reference (gray-on-gray circle), not the row mode tile.\n */\n emptyMarkBg: string;\n emptyMarkIcon: string;\n /** Pulse fill for the history skeleton (stronger than a hairline divider). */\n skeleton: string;\n}\n\nfunction buildTheme(isDark: boolean): ThemeTokens {\n if (isDark) {\n return {\n bg: '#0b1220',\n surface: mobileTokens.color.surface,\n title: '#f1f5f9',\n preview: '#94a3b8',\n meta: '#9aa0b8',\n muted: '#7a809a',\n divider: 'rgba(148, 163, 184, 0.12)',\n sectionLabel: '#cbd5e1',\n tileChatBg: 'rgba(148, 163, 184, 0.16)',\n tileChatIcon: '#e2e8f0',\n tileSearchBg: 'rgba(251, 191, 36, 0.16)',\n tileSearchIcon: '#fde68a',\n tileBuildBg: 'rgba(129, 140, 248, 0.18)',\n tileBuildIcon: '#c7d2fe',\n pressed: 'rgba(148, 163, 184, 0.10)',\n loadMoreText: '#e2e8f0',\n loadMoreBorder: 'rgba(148, 163, 184, 0.28)',\n loadMoreBg: 'rgba(148, 163, 184, 0.10)',\n refreshTint: '#cbd5e1',\n endDot: '#94a3b8',\n emptyMarkBg: 'rgba(148, 163, 184, 0.18)',\n emptyMarkIcon: '#b4bccc',\n skeleton: 'rgba(148, 163, 184, 0.22)',\n };\n }\n return {\n bg: mobileTokens.color.bg,\n surface: mobileTokens.color.surface,\n title: '#0b1424',\n preview: '#525a73',\n meta: '#7b8197',\n muted: '#94a3b8',\n divider: 'rgba(15, 23, 42, 0.06)',\n sectionLabel: '#374151',\n tileChatBg: 'rgba(15, 23, 42, 0.06)',\n tileChatIcon: '#1f2937',\n tileSearchBg: 'rgba(217, 119, 6, 0.10)',\n tileSearchIcon: '#b45309',\n tileBuildBg: mobileTokens.color.primarySoft,\n tileBuildIcon: mobileTokens.color.primary,\n pressed: 'rgba(15, 23, 42, 0.05)',\n loadMoreText: '#1f2937',\n loadMoreBorder: 'rgba(15, 23, 42, 0.15)',\n loadMoreBg: 'rgba(15, 23, 42, 0.04)',\n refreshTint: '#374151',\n endDot: '#9ca3af',\n emptyMarkBg: 'rgba(15, 23, 42, 0.07)',\n emptyMarkIcon: '#6b7280',\n skeleton: 'rgba(15, 23, 42, 0.08)',\n };\n}\n\n/**\n * Placeholder list that matches the real row geometry (40×40 tile, title + date,\n * preview line, section labels) so a slow first fetch still reads as history,\n * not a blank “Thinking…” screen.\n */\nfunction ChatHistorySkeleton({ bone }: { bone: string }) {\n const pulse = React.useRef(new Animated.Value(0.45)).current;\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, { toValue: 1, duration: 750, useNativeDriver: true }),\n Animated.timing(pulse, { toValue: 0.55, duration: 750, useNativeDriver: true }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse]);\n\n const Bone = ({ style }: { style: ViewStyle }) => (\n <Animated.View style={[styles.skelBone, { backgroundColor: bone, opacity: pulse }, style]} />\n );\n\n return (\n <View style={styles.listContent} accessibilityRole=\"progressbar\" accessibilityLabel=\"Loading chat history\">\n <View style={styles.sectionHeader}>\n <Bone style={styles.skelSection} />\n </View>\n {Array.from({ length: 3 }).map((_, i) => (\n <View key={`today-${i}`}>\n <View style={styles.row}>\n <Bone style={styles.skelTile} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Bone style={i % 2 === 0 ? styles.skelTitleWide : styles.skelTitle} />\n <Bone style={styles.skelDate} />\n </View>\n <Bone style={styles.skelPreview} />\n </View>\n </View>\n {i < 2 ? <View style={styles.divider} /> : null}\n </View>\n ))}\n <View style={styles.sectionHeader}>\n <Bone style={styles.skelSectionWide} />\n </View>\n {Array.from({ length: 5 }).map((_, i) => (\n <View key={`week-${i}`}>\n <View style={styles.row}>\n <Bone style={styles.skelTile} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Bone style={i % 3 === 0 ? styles.skelTitle : styles.skelTitleWide} />\n <Bone style={styles.skelDate} />\n </View>\n <Bone style={i % 2 === 0 ? styles.skelPreview : styles.skelPreviewShort} />\n </View>\n </View>\n {i < 4 ? <View style={styles.divider} /> : null}\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Leading 40×40 mode tile. Background and glyph reflect the conversation mode:\n * - chat → Lucide-style message bubble on indigo-tinted neutral\n * - deep-search → lightning glyph on amber-tinted neutral\n * - build → lightbulb on indigo (Web Builder sessions)\n *\n * Chat uses Feather (a Lucide port) so the row tile, the empty-state mark, and\n * the web header all share one bubble silhouette. Attachment-only threads use\n * a paperclip on the same chat tile so they are not titled with a raw filename.\n * Deep-search stays on MCI — Feather has no acceptable lightning glyph and the\n * amber/indigo split is already the primary mode signal.\n *\n * Real information per row, not decoration.\n */\nfunction ModeTile({\n mode,\n theme,\n isAttachment,\n}: {\n mode: ChatHistoryMode;\n theme: ThemeTokens;\n isAttachment?: boolean;\n}) {\n if (mode === 'deep-search') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileSearchBg }]}>\n <MaterialCommunityIcons name=\"lightning-bolt-outline\" size={18} color={theme.tileSearchIcon} />\n </View>\n );\n }\n if (mode === 'build') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileBuildBg }]}>\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={18} color={theme.tileBuildIcon} />\n </View>\n );\n }\n if (isAttachment) {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"paperclip\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n }\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"message-circle\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n}\n\nconst ChatHistoryRow = React.memo(function ChatHistoryRow({\n session,\n onSelectSession,\n theme,\n timeLabel,\n}: {\n session: SessionRow;\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n theme: ThemeTokens;\n timeLabel: string;\n}) {\n const titleColor = session.isPlaceholder ? theme.preview : theme.title;\n const titleStyle = [\n styles.rowTitle,\n { color: titleColor },\n session.isPlaceholder ? styles.rowTitlePlaceholder : null,\n ];\n return (\n <Pressable\n onPress={() => onSelectSession(session.channelId, session.mode)}\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: theme.pressed }]}\n accessibilityRole=\"button\"\n accessibilityLabel={\n session.isRunning\n ? `Open conversation: ${session.titleForRender}. Running. ${session.previewForRender || 'Working'}`\n : session.previewForRender\n ? `Open conversation: ${session.titleForRender}. ${session.previewForRender}. ${timeLabel}`\n : `Open conversation: ${session.titleForRender}, ${timeLabel}`\n }\n >\n <ModeTile mode={session.mode} theme={theme} isAttachment={session.isAttachment} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Text style={titleStyle} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.titleForRender}\n </Text>\n {session.isRunning ? (\n <View style={styles.rowRunningMeta}>\n <ActivityIndicator size=\"small\" color={theme.meta} />\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n Running\n </Text>\n </View>\n ) : (\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n {timeLabel}\n </Text>\n )}\n </View>\n {session.previewForRender || session.isRunning ? (\n <Text style={[styles.rowPreview, { color: theme.preview }]} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.previewForRender || 'Working…'}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n});\n\n/** Survives ChatHistory unmount so the next visit can skip-wait for orgName. */\nlet lastKnownHistoryOrgName: string | null = null;\n\nexport default function ChatHistoryLanding({ onSelectSession, orgName: orgNameProp }: ChatHistoryLandingProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const theme = React.useMemo(() => buildTheme(isDark), [isDark]);\n\n const apollo = useApolloClient();\n const { orgName: idsOrgName, accountUserId } = usePrerequisiteIds();\n /**\n * Org for NETWORK queries must come from an authoritative resolution (the\n * navigation prop or `usePrerequisiteIds`: settings -> membership). The module\n * latch and the disk snapshot are device-local hints: on 2026-09-13 they fed a\n * stale org from a previous sign-in into `channelsByUser`, which legitimately\n * returned zero rows and painted \"No conversations yet\" over real history.\n * They may still seed the CACHED paint below, never the query.\n */\n const orgName = orgNameProp || idsOrgName || null;\n const displayOrgName = orgName || lastKnownHistoryOrgName || peekChatHistorySnapshotOrgName(accountUserId);\n React.useEffect(() => {\n if (orgName) lastKnownHistoryOrgName = orgName;\n }, [orgName]);\n\n const [snapshotRows, setSnapshotRows] = React.useState(() =>\n peekChatHistorySnapshot(displayOrgName, accountUserId),\n );\n React.useEffect(() => {\n let alive = true;\n const apply = (rows: ChatHistorySession[]) => {\n if (alive) setSnapshotRows(rows);\n };\n apply(peekChatHistorySnapshot(displayOrgName, accountUserId));\n seedRememberedHistoryFromSessions(peekChatHistorySnapshot(displayOrgName, accountUserId));\n const matches = (snap: { accountId: string; orgName: string }) => {\n if (!accountUserId || snap.accountId !== accountUserId) return false;\n return !displayOrgName || snap.orgName === displayOrgName;\n };\n const unsub = subscribeChatHistorySnapshot((snap) => {\n if (!snap || !matches(snap)) return;\n apply(snap.rows);\n });\n void hydrateChatHistorySnapshot().then((snap) => {\n if (!alive || !snap || !matches(snap)) return;\n seedRememberedHistoryFromSessions(snap.rows);\n apply(snap.rows);\n });\n return () => {\n alive = false;\n unsub();\n };\n }, [displayOrgName, accountUserId]);\n\n const {\n sessions: liveSessions,\n sessionsLoaded,\n error: channelsError,\n refetch,\n sourceChannelCount,\n } = useChatHistorySessionsFromChannels(orgName, { skip: !orgName });\n\n const {\n sessions: promptSessions,\n refetch: refetchPrompts,\n sourcePostCount,\n } = useChatHistorySessionsFromMessages(accountUserId, {\n skip: !accountUserId,\n });\n const lastPromptSessionsRef = React.useRef(promptSessions);\n if (promptSessions.length > 0) {\n lastPromptSessionsRef.current = promptSessions;\n }\n const overlaySessions = promptSessions.length > 0 ? promptSessions : lastPromptSessionsRef.current;\n\n const [rememberedTick, setRememberedTick] = React.useState(0);\n React.useEffect(() => subscribeRememberedHistory(() => setRememberedTick((n) => n + 1)), []);\n\n /** \"Now\" reference recomputed on refresh so relative timestamps re-evaluate cleanly. */\n const [nowTs, setNowTs] = React.useState(() => Date.now());\n const [refreshing, setRefreshing] = React.useState(false);\n /** True only when the last fetch returned a full page (there may be more). */\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n /** After \"Load older\", `hasMore` comes from that page — don't reset from page-1 size. */\n const loadedPastFirstPageRef = React.useRef(false);\n /**\n * Extra pages from \"Load older\". Kept in React state so the list grows even when\n * Apollo returns the merged cache (skip>0 shares the page-1 slot).\n */\n const [olderSessions, setOlderSessions] = React.useState<ChatHistorySession[]>([]);\n const [olderPromptSessions, setOlderPromptSessions] = React.useState<ChatHistorySession[]>([]);\n const [channelMessageOverlays, setChannelMessageOverlays] = React.useState<ChatHistorySession[]>([]);\n const hydratedChannelIdsRef = React.useRef(new Set<string>());\n\n /**\n * \"Load older\" eligibility tracks both `channelsByUser` and `messages` page size.\n */\n React.useEffect(() => {\n if (loadedPastFirstPageRef.current) return;\n setHasMore(sourceChannelCount >= HISTORY_PAGE_SIZE || sourcePostCount >= HISTORY_PAGE_SIZE);\n }, [sourceChannelCount, sourcePostCount]);\n\n React.useEffect(() => {\n setOlderSessions([]);\n setOlderPromptSessions([]);\n setChannelMessageOverlays([]);\n hydratedChannelIdsRef.current = new Set();\n loadedPastFirstPageRef.current = false;\n }, [orgName, accountUserId]);\n\n const onRefresh = React.useCallback(async () => {\n if (!orgName) return;\n setRefreshing(true);\n loadedPastFirstPageRef.current = false;\n setOlderSessions([]);\n setOlderPromptSessions([]);\n setChannelMessageOverlays([]);\n hydratedChannelIdsRef.current = new Set();\n try {\n await Promise.all([\n refetch(getHistoryChannelsQueryVariables(orgName)),\n accountUserId ? refetchPrompts(getChatHistoryMessagesQueryVariables(accountUserId)) : Promise.resolve(),\n ]);\n setNowTs(Date.now());\n } catch {\n /* refetch errors surface via loading state. */\n } finally {\n setRefreshing(false);\n }\n }, [accountUserId, orgName, refetch, refetchPrompts]);\n\n /**\n * \"Load older\": next `HISTORY_PAGE_SIZE` channels and the next page of user\n * prompts. Do not use merged cache length as the page size.\n */\n const onLoadMore = React.useCallback(async () => {\n if (!orgName || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const knownIds = new Set<string>();\n for (const row of liveSessions) knownIds.add(row.channelId);\n for (const row of olderSessions) knownIds.add(row.channelId);\n const skip = knownIds.size;\n const [channelResult, messageResult] = await Promise.all([\n apollo.query({\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(orgName, {\n skip,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'chat-history-channels-list' },\n }),\n accountUserId\n ? apollo.query({\n query: MessagesDocument,\n variables: getChatHistoryMessagesQueryVariables(accountUserId, {\n skip: sourcePostCount,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'new-chat-history-messages' },\n })\n : Promise.resolve(null),\n ]);\n loadedPastFirstPageRef.current = true;\n const raw = channelResult.data?.channelsByUser ?? [];\n const page = raw.length > skip ? raw.slice(skip) : raw;\n const nextBatch = chatHistorySessionsFromChannels({ channelsByUser: page }).filter(\n (row) => !knownIds.has(row.channelId),\n );\n const nextPrompts = messageResult\n ? chatHistorySessionsFromMessages(messageResult.data).filter((row) => {\n const knownPrompt = overlaySessions.some((s) => s.channelId === row.channelId);\n const knownOlder = olderPromptSessions.some((s) => s.channelId === row.channelId);\n return !knownPrompt && !knownOlder;\n })\n : [];\n if (nextBatch.length === 0 && nextPrompts.length === 0) {\n setHasMore(false);\n return;\n }\n if (nextBatch.length > 0) {\n setOlderSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of nextBatch) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n }\n if (nextPrompts.length > 0) {\n setOlderPromptSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of nextPrompts) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n }\n const messagePageLen = messageResult?.data?.messages?.data?.length ?? 0;\n setHasMore(page.length >= HISTORY_PAGE_SIZE || messagePageLen >= HISTORY_PAGE_SIZE);\n } catch {\n /* next \"Load older\" tap retries the same skip. */\n } finally {\n setLoadingMore(false);\n }\n }, [\n accountUserId,\n apollo,\n hasMore,\n liveSessions,\n loadingMore,\n olderPromptSessions,\n olderSessions,\n orgName,\n overlaySessions,\n sourcePostCount,\n ]);\n\n /**\n * Canonical cached list + user-prompt titles, then pre-truncate for one-line render.\n */\n const sessions: SessionRow[] = React.useMemo(() => {\n const byId = new Map<string, ChatHistorySession>();\n for (const row of olderSessions) byId.set(row.channelId, row);\n const channelSessions = sessionsLoaded ? liveSessions : snapshotRows;\n for (const row of channelSessions) byId.set(row.channelId, row);\n const merged = enrichHistorySessionsWithUserPrompts(Array.from(byId.values()), [\n ...channelMessageOverlays,\n ...olderPromptSessions,\n ...overlaySessions,\n ]);\n return merged\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .map((s) => ({\n ...s,\n id: s.channelId,\n titleForRender: truncate(s.title, 64),\n previewForRender: s.preview ? truncate(s.preview, 96) : '',\n sortAt: s.updatedAt.getTime(),\n }));\n }, [\n channelMessageOverlays,\n liveSessions,\n olderPromptSessions,\n olderSessions,\n overlaySessions,\n rememberedTick,\n sessionsLoaded,\n snapshotRows,\n ]);\n\n const placeholderChannelKey = sessions\n .filter((row) => row.isPlaceholder || /^new chat$/i.test(row.title))\n .map((row) => row.channelId)\n .sort()\n .join('|');\n\n React.useEffect(() => {\n if (!sessionsLoaded || !placeholderChannelKey) return;\n const pending = placeholderChannelKey.split('|').filter((id) => id && !hydratedChannelIdsRef.current.has(id));\n if (!pending.length) return;\n pending.forEach((id) => hydratedChannelIdsRef.current.add(id));\n void fetchHistorySessionsForChannels(apollo, pending).then((rows) => {\n if (!rows.length) return;\n setChannelMessageOverlays((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of rows) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n });\n }, [apollo, placeholderChannelKey, sessionsLoaded]);\n\n React.useEffect(() => {\n if (!orgName || !accountUserId || !sessionsLoaded || channelsError) return;\n persistChatHistorySnapshot(\n accountUserId,\n orgName,\n sessions.map((row) => ({\n channelId: row.channelId,\n title: row.title,\n preview: row.preview,\n mode: row.mode,\n updatedAt: row.updatedAt,\n createdAt: row.createdAt,\n isPlaceholder: row.isPlaceholder,\n isAttachment: row.isAttachment,\n })),\n );\n }, [accountUserId, channelsError, orgName, sessions, sessionsLoaded]);\n\n /**\n * A row is \"Running\" only because this device sent the turn and then popped\n * Chat on the way here, which tore down the stream callbacks that clear the\n * badge. Watch those rows from here (server-owned stream: seed + deltas +\n * final) and, since the list is cache-first, ask the server once whether the\n * reply already landed while nothing was listening.\n */\n const runningChannelIds = React.useMemo(\n () => sessions.filter((row) => row.isRunning).map((row) => row.channelId),\n [sessions],\n );\n const refetchHistory = React.useCallback(() => {\n if (!orgName) return;\n refetch(getHistoryChannelsQueryVariables(orgName)).catch(() => {\n /* the row settles on the next refresh instead. */\n });\n }, [orgName, refetch]);\n const hasRunningRows = runningChannelIds.length > 0;\n React.useEffect(() => {\n if (hasRunningRows) refetchHistory();\n }, [hasRunningRows, refetchHistory]);\n useHistoryRunWatcher(runningChannelIds, refetchHistory);\n\n const showLoadMore = hasMore;\n\n const sections = React.useMemo(() => buildSections(sessions, nowTs), [sessions, nowTs]);\n /**\n * Skeleton only when we have nothing to paint. Cache-first or a disk snapshot\n * fills the list immediately; the network can catch up behind it. While the\n * authoritative org is still resolving we stay on the skeleton (or cached\n * rows) - never on the empty state, which must mean \"the server said you have\n * no conversations\", not \"we could not ask yet\".\n */\n const initialLoading = (!orgName || !sessionsLoaded) && snapshotRows.length === 0 && !channelsError;\n /**\n * A failed channels query with nothing cached is an ERROR, not an empty\n * history - during the 2026-09-13 dev outage this screen showed \"No\n * conversations yet\" while the backend was down, which reads as data loss.\n */\n const showErrorState = Boolean(channelsError) && sessions.length === 0;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n const containerStyle = { maxWidth: contentMaxWidth, alignSelf: 'center' as const, width: '100%' as const };\n\n const listFooter = showLoadMore ? (\n <View style={[styles.footer, containerStyle]}>\n <Pressable\n onPress={() => void onLoadMore()}\n disabled={loadingMore}\n style={({ pressed }) => [\n styles.loadMore,\n {\n backgroundColor: theme.loadMoreBg,\n borderColor: theme.loadMoreBorder,\n },\n loadingMore && { opacity: 0.7 },\n pressed && !loadingMore && { opacity: 0.8 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Load older conversations\"\n >\n {loadingMore ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Load older</Text>\n )}\n </Pressable>\n </View>\n ) : !showLoadMore && sessions.length > 0 ? (\n <View style={[styles.endHint, containerStyle]}>\n <View style={[styles.endHintDot, { backgroundColor: theme.endDot, opacity: 0.5 }]} />\n <Text style={[styles.endHintText, { color: theme.muted }]}>{\"You're all caught up\"}</Text>\n </View>\n ) : (\n <View style={{ height: 24 }} />\n );\n\n /**\n * Hairline divider between rows, inset to start where the title column does\n * (past the 40px tile + 14px gap = 54px). Quieter than full-bleed; confirms\n * the column the eye is scanning.\n */\n const renderItemSeparator = React.useCallback(\n () => <View style={[styles.divider, { backgroundColor: theme.divider }]} />,\n [theme.divider],\n );\n\n return (\n <View style={[styles.container, { backgroundColor: theme.bg }]}>\n {initialLoading ? (\n <ChatHistorySkeleton bone={theme.skeleton} />\n ) : showErrorState ? (\n <View style={styles.emptyStateWrap}>\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"cloud-off\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>{\"Couldn't load conversations\"}</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Something went wrong on our side. Your history is safe - try again in a moment.\n </Text>\n <Pressable\n onPress={() => void onRefresh()}\n disabled={refreshing}\n style={({ pressed }) => [\n styles.loadMore,\n styles.retryButton,\n { backgroundColor: theme.loadMoreBg, borderColor: theme.loadMoreBorder },\n (pressed || refreshing) && { opacity: 0.7 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Retry loading conversations\"\n >\n {refreshing ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Try again</Text>\n )}\n </Pressable>\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n {/**\n * Empty-state mark: circular neutral disk with a Lucide-style chat\n * bubble. Uses Feather (same glyph family as the web's lucide-react\n * `MessageCircle`) instead of MCI so the rounded body + tail proportions\n * match the web reference 1:1. Glyph fills ~55% of the disk so it\n * reads as a real focal point, not decoration.\n */}\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"message-circle\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>No conversations yet</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Start your first chat to see your conversation history here.\n </Text>\n </View>\n ) : (\n <SectionList\n sections={sections}\n keyExtractor={(item) => item.channelId}\n stickySectionHeadersEnabled={false}\n initialNumToRender={HISTORY_PAGE_SIZE}\n maxToRenderPerBatch={8}\n windowSize={7}\n updateCellsBatchingPeriod={50}\n removeClippedSubviews\n contentContainerStyle={[styles.listContent, containerStyle, { paddingBottom: 32 }]}\n ListFooterComponent={listFooter}\n ItemSeparatorComponent={renderItemSeparator}\n refreshControl={\n <RefreshControl\n refreshing={refreshing}\n onRefresh={() => void onRefresh()}\n tintColor={theme.refreshTint}\n colors={[theme.refreshTint]}\n />\n }\n renderSectionHeader={({ section }) => (\n <View style={styles.sectionHeader}>\n <Text style={[styles.sectionLabel, { color: theme.sectionLabel }]}>{section.title}</Text>\n </View>\n )}\n renderItem={({ item }) => (\n <ChatHistoryRow\n session={item}\n onSelectSession={onSelectSession}\n theme={theme}\n timeLabel={relativeTime(item.sortAt, nowTs)}\n />\n )}\n showsVerticalScrollIndicator={false}\n />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 20,\n paddingTop: 4,\n },\n /**\n * Section header: sentence case, indigo-tinted, modest size. 28px top padding\n * establishes rhythm between groups without dead air below the label.\n */\n sectionHeader: {\n paddingTop: 28,\n paddingBottom: 10,\n paddingHorizontal: 2,\n },\n sectionLabel: {\n fontSize: 12,\n fontWeight: '700',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n },\n /**\n * Row: leading 40×40 mode tile, two-line body (title + preview), right-aligned\n * date aligned to the title's baseline. 14px gap matches the tile-to-text\n * rhythm in Manus / iOS Mail.\n */\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 2,\n gap: 14,\n },\n tile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n },\n rowHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: 10,\n },\n rowTitle: {\n flex: 1,\n fontSize: 16,\n fontWeight: '600',\n letterSpacing: -0.1,\n lineHeight: 22,\n },\n rowTitlePlaceholder: {\n fontWeight: '500',\n fontStyle: 'italic',\n },\n rowDate: {\n fontSize: 12.5,\n fontWeight: '500',\n fontVariant: ['tabular-nums'],\n },\n rowRunningMeta: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n rowPreview: {\n marginTop: 2,\n fontSize: 13.5,\n lineHeight: 19,\n fontWeight: '400',\n letterSpacing: -0.05,\n },\n /**\n * Indented hairline: starts past the tile column (40 + 14 = 54) so the rule\n * aligns with the title's leading edge. Mail-style.\n */\n divider: {\n height: StyleSheet.hairlineWidth,\n marginLeft: 56,\n },\n footer: {\n paddingTop: 28,\n paddingBottom: 8,\n alignItems: 'center',\n },\n /** Bordered ink-neutral pill. Label is the affordance, no leading icon, no chevron. */\n retryButton: {\n marginTop: 20,\n },\n loadMore: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 10,\n paddingHorizontal: 18,\n borderRadius: 999,\n borderWidth: 1,\n minWidth: 132,\n },\n loadMoreText: {\n fontSize: 13.5,\n fontWeight: '600',\n letterSpacing: -0.05,\n },\n endHint: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n paddingTop: 32,\n paddingBottom: 12,\n },\n endHintDot: {\n width: 4,\n height: 4,\n borderRadius: 2,\n },\n endHintText: {\n fontSize: 12.5,\n fontWeight: '500',\n letterSpacing: 0.1,\n },\n /**\n * Empty state: stack a 64×64 indigo-tinted mark over title + subtitle.\n * Generous vertical gap (16) between mark and title; tighter gap (6)\n * between title and subtitle so the pair reads as one unit hanging off\n * the mark, not three independent items.\n */\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n },\n emptyMark: {\n width: 72,\n height: 72,\n borderRadius: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 18,\n },\n emptyTitle: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.3,\n textAlign: 'center',\n marginBottom: 6,\n },\n emptySubtitle: {\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 340,\n },\n skelBone: {\n borderRadius: 6,\n },\n skelSection: {\n width: 52,\n height: 12,\n borderRadius: 4,\n },\n skelSectionWide: {\n width: 118,\n height: 12,\n borderRadius: 4,\n },\n skelTile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n },\n skelTitle: {\n flex: 1,\n maxWidth: 148,\n height: 14,\n borderRadius: 5,\n },\n skelTitleWide: {\n flex: 1,\n maxWidth: 210,\n height: 14,\n borderRadius: 5,\n },\n skelDate: {\n width: 28,\n height: 11,\n borderRadius: 4,\n },\n skelPreview: {\n marginTop: 8,\n width: '78%',\n height: 11,\n borderRadius: 4,\n },\n skelPreviewShort: {\n marginTop: 8,\n width: '54%',\n height: 11,\n borderRadius: 4,\n },\n});\n"],"names":["d","ChatHistoryRow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport {\n ActivityIndicator,\n Animated,\n Pressable,\n RefreshControl,\n SectionList,\n StyleSheet,\n View,\n useColorScheme,\n useWindowDimensions,\n type ViewStyle,\n} from 'react-native';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport {\n HISTORY_PAGE_SIZE,\n chatHistorySessionsFromChannels,\n chatHistorySessionsFromMessages,\n enrichHistorySessionsWithUserPrompts,\n fetchHistorySessionsForChannels,\n getChatHistoryMessagesQueryVariables,\n getHistoryChannelsQueryVariables,\n seedRememberedHistoryFromSessions,\n subscribeRememberedHistory,\n useChatHistorySessionsFromChannels,\n useChatHistorySessionsFromMessages,\n type ChatHistoryMode,\n type ChatHistorySession,\n} from '../../../hooks/useChatApi';\nimport { useApolloClient } from '@apollo/client';\nimport { GetChannelsByUserWithLastMessageDocument, MessagesDocument } from 'common/graphql';\nimport { usePrerequisiteIds } from '../../../hooks/usePrerequisiteIds';\nimport { useHistoryRunWatcher } from '../../../hooks/useHistoryRunWatcher';\nimport { mobileTokens } from '../../../theme/mobileTokens';\nimport {\n hydrateChatHistorySnapshot,\n peekChatHistorySnapshot,\n peekChatHistorySnapshotOrgName,\n persistChatHistorySnapshot,\n subscribeChatHistorySnapshot,\n} from '../../../features/chat/chatHistorySnapshot';\n\n/**\n * Chat history list for mobile.\n *\n * Data: `useGetChannelsByUserWithLastMessageQuery` returning one row per channel\n * with `lastMessage` carrying the parent user prompt and the assistant reply.\n *\n * Layout: Manus-style two-line row — 40×40 leading mode tile, **line 1** =\n * `lastMessage.propsConfiguration.contents.parent.message` (user prompt),\n * **line 2** = `lastMessage.message` (latest post body, including agent errors\n * such as lines starting with ⚠), right-aligned short date. Indigo-tinted\n * neutrals so the surface stays in the Yantra brand register.\n *\n * Mode tile carries real information (chat vs deep-search), not decoration —\n * different modes get different glyphs and tints.\n */\ninterface ChatHistoryLandingProps {\n /**\n * `mode` is derived per-row via `detectMode(channel)`. Build sessions open\n * Web Builder; chat / deep-search open Chat.\n */\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n /** Kept in the contract; not surfaced here — new-chat lives in the screen header. */\n onCompose: () => void;\n /** Route org slug when known — avoids waiting on `usePrerequisiteIds` to hit the cache. */\n orgName?: string | null;\n}\n\ninterface SessionRow extends ChatHistorySession {\n id: string;\n /** Pre-truncated title for one-line render. */\n titleForRender: string;\n /** Pre-truncated preview for one-line render (empty if suppressed upstream). */\n previewForRender: string;\n /** Cached unix-ms for bucketing / sorting. */\n sortAt: number;\n}\n\ninterface SessionSection {\n key: 'today' | 'yesterday' | 'week' | 'earlier';\n title: string;\n data: SessionRow[];\n}\n\nfunction truncate(text: string, max = 96): 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\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction relativeTime(ts: number, now: number): string {\n const deltaMs = now - ts;\n if (deltaMs < 60_000) return 'now';\n const minutes = Math.floor(deltaMs / 60_000);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) {\n const d = new Date(ts);\n return WEEKDAYS[d.getDay()] ?? `${days}d`;\n }\n /**\n * 7d+: numeric short date (e.g. \"2/18\" matching the Manus reference). Year only\n * appears when crossing into a previous year, to keep the right column compact.\n */\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const m = d.getMonth() + 1;\n const day = d.getDate();\n return sameYear ? `${m}/${day}` : `${m}/${day}/${String(d.getFullYear()).slice(2)}`;\n}\n\nfunction bucketFor(ts: number, now: number): SessionSection['key'] {\n const a = new Date(ts);\n const b = new Date(now);\n const startOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const today = startOf(b);\n const yesterday = today - 24 * 60 * 60 * 1000;\n const weekAgo = today - 7 * 24 * 60 * 60 * 1000;\n const tsDay = startOf(a);\n if (tsDay >= today) return 'today';\n if (tsDay >= yesterday) return 'yesterday';\n if (tsDay >= weekAgo) return 'week';\n return 'earlier';\n}\n\nfunction buildSections(rows: SessionRow[], now: number): SessionSection[] {\n const buckets: Record<SessionSection['key'], SessionRow[]> = {\n today: [],\n yesterday: [],\n week: [],\n earlier: [],\n };\n for (const row of rows) {\n buckets[bucketFor(row.sortAt, now)].push(row);\n }\n const out: SessionSection[] = [];\n if (buckets.today.length) out.push({ key: 'today', title: 'TODAY', data: buckets.today });\n if (buckets.yesterday.length) out.push({ key: 'yesterday', title: 'YESTERDAY', data: buckets.yesterday });\n if (buckets.week.length) out.push({ key: 'week', title: 'PREVIOUS 7 DAYS', data: buckets.week });\n if (buckets.earlier.length) out.push({ key: 'earlier', title: 'EARLIER', data: buckets.earlier });\n return out;\n}\n\n/**\n * Theme tokens.\n *\n * Color strategy: Monochrome ink. Chrome (section labels, chat tile, load-more\n * pill, end-of-list dot, press wash, refresh spinner) is rendered in tinted\n * neutrals so the only real color on the screen is the deep-search amber —\n * which then reliably signals a mode, not decoration. Neutrals carry chroma\n * 0.005–0.01 toward the brand hue (no pure `#fff` / `#000`).\n */\ninterface ThemeTokens {\n bg: string;\n surface: string;\n title: string;\n preview: string;\n meta: string;\n muted: string;\n divider: string;\n sectionLabel: string;\n /** Mode tile (chat) — neutral ink on neutral fill. */\n tileChatBg: string;\n tileChatIcon: string;\n /** Mode tile (deep-search) — amber kept as the one real mode color. */\n tileSearchBg: string;\n tileSearchIcon: string;\n /** Mode tile (build / Web Builder) — indigo, same accent as the composer lightbulb. */\n tileBuildBg: string;\n tileBuildIcon: string;\n pressed: string;\n loadMoreText: string;\n loadMoreBorder: string;\n loadMoreBg: string;\n refreshTint: string;\n endDot: string;\n /**\n * Empty-state mark — circular soft-neutral disk holding a chat glyph.\n * Matches the web reference (gray-on-gray circle), not the row mode tile.\n */\n emptyMarkBg: string;\n emptyMarkIcon: string;\n /** Pulse fill for the history skeleton (stronger than a hairline divider). */\n skeleton: string;\n}\n\nfunction buildTheme(isDark: boolean): ThemeTokens {\n if (isDark) {\n return {\n bg: '#0b1220',\n surface: mobileTokens.color.surface,\n title: '#f1f5f9',\n preview: '#94a3b8',\n meta: '#9aa0b8',\n muted: '#7a809a',\n divider: 'rgba(148, 163, 184, 0.12)',\n sectionLabel: '#cbd5e1',\n tileChatBg: 'rgba(148, 163, 184, 0.16)',\n tileChatIcon: '#e2e8f0',\n tileSearchBg: 'rgba(251, 191, 36, 0.16)',\n tileSearchIcon: '#fde68a',\n tileBuildBg: 'rgba(129, 140, 248, 0.18)',\n tileBuildIcon: '#c7d2fe',\n pressed: 'rgba(148, 163, 184, 0.10)',\n loadMoreText: '#e2e8f0',\n loadMoreBorder: 'rgba(148, 163, 184, 0.28)',\n loadMoreBg: 'rgba(148, 163, 184, 0.10)',\n refreshTint: '#cbd5e1',\n endDot: '#94a3b8',\n emptyMarkBg: 'rgba(148, 163, 184, 0.18)',\n emptyMarkIcon: '#b4bccc',\n skeleton: 'rgba(148, 163, 184, 0.22)',\n };\n }\n return {\n bg: mobileTokens.color.bg,\n surface: mobileTokens.color.surface,\n title: '#0b1424',\n preview: '#525a73',\n meta: '#7b8197',\n muted: '#94a3b8',\n divider: 'rgba(15, 23, 42, 0.06)',\n sectionLabel: '#374151',\n tileChatBg: 'rgba(15, 23, 42, 0.06)',\n tileChatIcon: '#1f2937',\n tileSearchBg: 'rgba(217, 119, 6, 0.10)',\n tileSearchIcon: '#b45309',\n tileBuildBg: mobileTokens.color.primarySoft,\n tileBuildIcon: mobileTokens.color.primary,\n pressed: 'rgba(15, 23, 42, 0.05)',\n loadMoreText: '#1f2937',\n loadMoreBorder: 'rgba(15, 23, 42, 0.15)',\n loadMoreBg: 'rgba(15, 23, 42, 0.04)',\n refreshTint: '#374151',\n endDot: '#9ca3af',\n emptyMarkBg: 'rgba(15, 23, 42, 0.07)',\n emptyMarkIcon: '#6b7280',\n skeleton: 'rgba(15, 23, 42, 0.08)',\n };\n}\n\n/**\n * Placeholder list that matches the real row geometry (40×40 tile, title + date,\n * preview line, section labels) so a slow first fetch still reads as history,\n * not a blank “Thinking…” screen.\n */\nfunction ChatHistorySkeleton({ bone }: { bone: string }) {\n const pulse = React.useRef(new Animated.Value(0.45)).current;\n React.useEffect(() => {\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, { toValue: 1, duration: 750, useNativeDriver: true }),\n Animated.timing(pulse, { toValue: 0.55, duration: 750, useNativeDriver: true }),\n ]),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse]);\n\n const Bone = ({ style }: { style: ViewStyle }) => (\n <Animated.View style={[styles.skelBone, { backgroundColor: bone, opacity: pulse }, style]} />\n );\n\n return (\n <View style={styles.listContent} accessibilityRole=\"progressbar\" accessibilityLabel=\"Loading chat history\">\n <View style={styles.sectionHeader}>\n <Bone style={styles.skelSection} />\n </View>\n {Array.from({ length: 3 }).map((_, i) => (\n <View key={`today-${i}`}>\n <View style={styles.row}>\n <Bone style={styles.skelTile} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Bone style={i % 2 === 0 ? styles.skelTitleWide : styles.skelTitle} />\n <Bone style={styles.skelDate} />\n </View>\n <Bone style={styles.skelPreview} />\n </View>\n </View>\n {i < 2 ? <View style={styles.divider} /> : null}\n </View>\n ))}\n <View style={styles.sectionHeader}>\n <Bone style={styles.skelSectionWide} />\n </View>\n {Array.from({ length: 5 }).map((_, i) => (\n <View key={`week-${i}`}>\n <View style={styles.row}>\n <Bone style={styles.skelTile} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Bone style={i % 3 === 0 ? styles.skelTitle : styles.skelTitleWide} />\n <Bone style={styles.skelDate} />\n </View>\n <Bone style={i % 2 === 0 ? styles.skelPreview : styles.skelPreviewShort} />\n </View>\n </View>\n {i < 4 ? <View style={styles.divider} /> : null}\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Leading 40×40 mode tile. Background and glyph reflect the conversation mode:\n * - chat → Lucide-style message bubble on indigo-tinted neutral\n * - deep-search → lightning glyph on amber-tinted neutral\n * - build → lightbulb on indigo (Web Builder sessions)\n *\n * Chat uses Feather (a Lucide port) so the row tile, the empty-state mark, and\n * the web header all share one bubble silhouette. Attachment-only threads use\n * a paperclip on the same chat tile so they are not titled with a raw filename.\n * Deep-search stays on MCI — Feather has no acceptable lightning glyph and the\n * amber/indigo split is already the primary mode signal.\n *\n * Real information per row, not decoration.\n */\nfunction ModeTile({\n mode,\n theme,\n isAttachment,\n}: {\n mode: ChatHistoryMode;\n theme: ThemeTokens;\n isAttachment?: boolean;\n}) {\n if (mode === 'deep-search') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileSearchBg }]}>\n <MaterialCommunityIcons name=\"lightning-bolt-outline\" size={18} color={theme.tileSearchIcon} />\n </View>\n );\n }\n if (mode === 'build') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileBuildBg }]}>\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={18} color={theme.tileBuildIcon} />\n </View>\n );\n }\n if (isAttachment) {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"paperclip\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n }\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"message-circle\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n}\n\nconst ChatHistoryRow = React.memo(function ChatHistoryRow({\n session,\n onSelectSession,\n theme,\n timeLabel,\n}: {\n session: SessionRow;\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n theme: ThemeTokens;\n timeLabel: string;\n}) {\n const titleColor = session.isPlaceholder ? theme.preview : theme.title;\n const titleStyle = [\n styles.rowTitle,\n { color: titleColor },\n session.isPlaceholder ? styles.rowTitlePlaceholder : null,\n ];\n return (\n <Pressable\n onPress={() => onSelectSession(session.channelId, session.mode)}\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: theme.pressed }]}\n accessibilityRole=\"button\"\n accessibilityLabel={\n session.isRunning\n ? `Open conversation: ${session.titleForRender}. Running. ${session.previewForRender || 'Working'}`\n : session.previewForRender\n ? `Open conversation: ${session.titleForRender}. ${session.previewForRender}. ${timeLabel}`\n : `Open conversation: ${session.titleForRender}, ${timeLabel}`\n }\n >\n <ModeTile mode={session.mode} theme={theme} isAttachment={session.isAttachment} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Text style={titleStyle} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.titleForRender}\n </Text>\n {session.isRunning ? (\n <View style={styles.rowRunningMeta}>\n <ActivityIndicator size=\"small\" color={theme.meta} />\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n Running\n </Text>\n </View>\n ) : (\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n {timeLabel}\n </Text>\n )}\n </View>\n {session.previewForRender || session.isRunning ? (\n <Text style={[styles.rowPreview, { color: theme.preview }]} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.previewForRender || 'Working…'}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n});\n\n/** Survives ChatHistory unmount so the next visit can skip-wait for orgName. */\nlet lastKnownHistoryOrgName: string | null = null;\n\nexport default function ChatHistoryLanding({ onSelectSession, orgName: orgNameProp }: ChatHistoryLandingProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const theme = React.useMemo(() => buildTheme(isDark), [isDark]);\n\n const apollo = useApolloClient();\n const { orgName: idsOrgName, accountUserId } = usePrerequisiteIds();\n /**\n * Org for NETWORK queries must come from an authoritative resolution (the\n * navigation prop or `usePrerequisiteIds`: settings -> membership). The module\n * latch and the disk snapshot are device-local hints: on 2026-09-13 they fed a\n * stale org from a previous sign-in into `channelsByUser`, which legitimately\n * returned zero rows and painted \"No conversations yet\" over real history.\n * They may still seed the CACHED paint below, never the query.\n */\n const orgName = orgNameProp || idsOrgName || null;\n const displayOrgName = orgName || lastKnownHistoryOrgName || peekChatHistorySnapshotOrgName(accountUserId);\n React.useEffect(() => {\n if (orgName) lastKnownHistoryOrgName = orgName;\n }, [orgName]);\n\n const [snapshotRows, setSnapshotRows] = React.useState(() =>\n peekChatHistorySnapshot(displayOrgName, accountUserId),\n );\n React.useEffect(() => {\n let alive = true;\n const apply = (rows: ChatHistorySession[]) => {\n if (alive) setSnapshotRows(rows);\n };\n apply(peekChatHistorySnapshot(displayOrgName, accountUserId));\n seedRememberedHistoryFromSessions(peekChatHistorySnapshot(displayOrgName, accountUserId));\n const matches = (snap: { accountId: string; orgName: string }) => {\n if (!accountUserId || snap.accountId !== accountUserId) return false;\n return !displayOrgName || snap.orgName === displayOrgName;\n };\n const unsub = subscribeChatHistorySnapshot((snap) => {\n if (!snap || !matches(snap)) return;\n apply(snap.rows);\n });\n void hydrateChatHistorySnapshot().then((snap) => {\n if (!alive || !snap || !matches(snap)) return;\n seedRememberedHistoryFromSessions(snap.rows);\n apply(snap.rows);\n });\n return () => {\n alive = false;\n unsub();\n };\n }, [displayOrgName, accountUserId]);\n\n const {\n sessions: liveSessions,\n sessionsLoaded,\n error: channelsError,\n refetch,\n sourceChannelCount,\n } = useChatHistorySessionsFromChannels(orgName, { skip: !orgName });\n\n const {\n sessions: promptSessions,\n refetch: refetchPrompts,\n sourcePostCount,\n } = useChatHistorySessionsFromMessages(accountUserId, {\n skip: !accountUserId,\n });\n const lastPromptSessionsRef = React.useRef(promptSessions);\n if (promptSessions.length > 0) {\n lastPromptSessionsRef.current = promptSessions;\n }\n const overlaySessions = promptSessions.length > 0 ? promptSessions : lastPromptSessionsRef.current;\n\n const [rememberedTick, setRememberedTick] = React.useState(0);\n React.useEffect(() => subscribeRememberedHistory(() => setRememberedTick((n) => n + 1)), []);\n\n /** \"Now\" reference recomputed on refresh so relative timestamps re-evaluate cleanly. */\n const [nowTs, setNowTs] = React.useState(() => Date.now());\n const [refreshing, setRefreshing] = React.useState(false);\n /** True only when the last fetch returned a full page (there may be more). */\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n /** After \"Load older\", `hasMore` comes from that page — don't reset from page-1 size. */\n const loadedPastFirstPageRef = React.useRef(false);\n /**\n * Extra pages from \"Load older\". Kept in React state so the list grows even when\n * Apollo returns the merged cache (skip>0 shares the page-1 slot).\n */\n const [olderSessions, setOlderSessions] = React.useState<ChatHistorySession[]>([]);\n const [olderPromptSessions, setOlderPromptSessions] = React.useState<ChatHistorySession[]>([]);\n const [channelMessageOverlays, setChannelMessageOverlays] = React.useState<ChatHistorySession[]>([]);\n const hydratedChannelIdsRef = React.useRef(new Set<string>());\n\n /**\n * \"Load older\" eligibility tracks both `channelsByUser` and `messages` page size.\n */\n React.useEffect(() => {\n if (loadedPastFirstPageRef.current) return;\n setHasMore(sourceChannelCount >= HISTORY_PAGE_SIZE || sourcePostCount >= HISTORY_PAGE_SIZE);\n }, [sourceChannelCount, sourcePostCount]);\n\n React.useEffect(() => {\n setOlderSessions([]);\n setOlderPromptSessions([]);\n setChannelMessageOverlays([]);\n hydratedChannelIdsRef.current = new Set();\n loadedPastFirstPageRef.current = false;\n }, [orgName, accountUserId]);\n\n const onRefresh = React.useCallback(async () => {\n if (!orgName) return;\n setRefreshing(true);\n loadedPastFirstPageRef.current = false;\n setOlderSessions([]);\n setOlderPromptSessions([]);\n setChannelMessageOverlays([]);\n hydratedChannelIdsRef.current = new Set();\n try {\n await Promise.all([\n refetch(getHistoryChannelsQueryVariables(orgName)),\n accountUserId ? refetchPrompts(getChatHistoryMessagesQueryVariables(accountUserId)) : Promise.resolve(),\n ]);\n setNowTs(Date.now());\n } catch {\n /* refetch errors surface via loading state. */\n } finally {\n setRefreshing(false);\n }\n }, [accountUserId, orgName, refetch, refetchPrompts]);\n\n /**\n * \"Load older\": next `HISTORY_PAGE_SIZE` channels and the next page of user\n * prompts. Do not use merged cache length as the page size.\n */\n const onLoadMore = React.useCallback(async () => {\n if (!orgName || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const knownIds = new Set<string>();\n for (const row of liveSessions) knownIds.add(row.channelId);\n for (const row of olderSessions) knownIds.add(row.channelId);\n const skip = knownIds.size;\n const [channelResult, messageResult] = await Promise.all([\n apollo.query({\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(orgName, {\n skip,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'chat-history-channels-list' },\n }),\n accountUserId\n ? apollo.query({\n query: MessagesDocument,\n variables: getChatHistoryMessagesQueryVariables(accountUserId, {\n skip: sourcePostCount,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'new-chat-history-messages' },\n })\n : Promise.resolve(null),\n ]);\n loadedPastFirstPageRef.current = true;\n const raw = channelResult.data?.channelsByUser ?? [];\n const page = raw.length > skip ? raw.slice(skip) : raw;\n const nextBatch = chatHistorySessionsFromChannels({ channelsByUser: page }).filter(\n (row) => !knownIds.has(row.channelId),\n );\n const nextPrompts = messageResult\n ? chatHistorySessionsFromMessages(messageResult.data).filter((row) => {\n const knownPrompt = overlaySessions.some((s) => s.channelId === row.channelId);\n const knownOlder = olderPromptSessions.some((s) => s.channelId === row.channelId);\n return !knownPrompt && !knownOlder;\n })\n : [];\n if (nextBatch.length === 0 && nextPrompts.length === 0) {\n setHasMore(false);\n return;\n }\n if (nextBatch.length > 0) {\n setOlderSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of nextBatch) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n }\n if (nextPrompts.length > 0) {\n setOlderPromptSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of nextPrompts) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n }\n const messagePageLen = messageResult?.data?.messages?.data?.length ?? 0;\n setHasMore(page.length >= HISTORY_PAGE_SIZE || messagePageLen >= HISTORY_PAGE_SIZE);\n } catch {\n /* next \"Load older\" tap retries the same skip. */\n } finally {\n setLoadingMore(false);\n }\n }, [\n accountUserId,\n apollo,\n hasMore,\n liveSessions,\n loadingMore,\n olderPromptSessions,\n olderSessions,\n orgName,\n overlaySessions,\n sourcePostCount,\n ]);\n\n /**\n * Canonical cached list + user-prompt titles, then pre-truncate for one-line render.\n */\n const sessions: SessionRow[] = React.useMemo(() => {\n const byId = new Map<string, ChatHistorySession>();\n for (const row of olderSessions) byId.set(row.channelId, row);\n const channelSessions = sessionsLoaded ? liveSessions : snapshotRows;\n for (const row of channelSessions) byId.set(row.channelId, row);\n const merged = enrichHistorySessionsWithUserPrompts(Array.from(byId.values()), [\n ...channelMessageOverlays,\n ...olderPromptSessions,\n ...overlaySessions,\n ]);\n return merged\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .map((s) => ({\n ...s,\n id: s.channelId,\n titleForRender: truncate(s.title, 64),\n previewForRender: s.preview ? truncate(s.preview, 96) : '',\n sortAt: s.updatedAt.getTime(),\n }));\n }, [\n channelMessageOverlays,\n liveSessions,\n olderPromptSessions,\n olderSessions,\n overlaySessions,\n rememberedTick,\n sessionsLoaded,\n snapshotRows,\n ]);\n\n const placeholderChannelKey = sessions\n .filter((row) => row.isPlaceholder || /^new chat$/i.test(row.title))\n .map((row) => row.channelId)\n .sort()\n .join('|');\n\n React.useEffect(() => {\n if (!sessionsLoaded || !placeholderChannelKey) return;\n const pending = placeholderChannelKey.split('|').filter((id) => id && !hydratedChannelIdsRef.current.has(id));\n if (!pending.length) return;\n pending.forEach((id) => hydratedChannelIdsRef.current.add(id));\n void fetchHistorySessionsForChannels(apollo, pending).then((rows) => {\n if (!rows.length) return;\n setChannelMessageOverlays((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const row of prev) map.set(row.channelId, row);\n for (const row of rows) map.set(row.channelId, row);\n return Array.from(map.values());\n });\n });\n }, [apollo, placeholderChannelKey, sessionsLoaded]);\n\n React.useEffect(() => {\n if (!orgName || !accountUserId || !sessionsLoaded || channelsError) return;\n persistChatHistorySnapshot(\n accountUserId,\n orgName,\n sessions.map((row) => ({\n channelId: row.channelId,\n title: row.title,\n preview: row.preview,\n mode: row.mode,\n updatedAt: row.updatedAt,\n createdAt: row.createdAt,\n isPlaceholder: row.isPlaceholder,\n isAttachment: row.isAttachment,\n })),\n );\n }, [accountUserId, channelsError, orgName, sessions, sessionsLoaded]);\n\n /**\n * A row is \"Running\" only because this device sent the turn and then popped\n * Chat on the way here, which tore down the stream callbacks that clear the\n * badge. Watch those rows from here (server-owned stream: seed + deltas +\n * final) and, since the list is cache-first, ask the server once whether the\n * reply already landed while nothing was listening.\n */\n const runningChannelIds = React.useMemo(\n () => sessions.filter((row) => row.isRunning).map((row) => row.channelId),\n [sessions],\n );\n const refetchHistory = React.useCallback(() => {\n if (!orgName) return;\n refetch(getHistoryChannelsQueryVariables(orgName)).catch(() => {\n /* the row settles on the next refresh instead. */\n });\n }, [orgName, refetch]);\n const hasRunningRows = runningChannelIds.length > 0;\n React.useEffect(() => {\n if (hasRunningRows) refetchHistory();\n }, [hasRunningRows, refetchHistory]);\n useHistoryRunWatcher(runningChannelIds, refetchHistory);\n\n const showLoadMore = hasMore;\n\n const sections = React.useMemo(() => buildSections(sessions, nowTs), [sessions, nowTs]);\n /**\n * Skeleton only when we have nothing to paint. Cache-first or a disk snapshot\n * fills the list immediately; the network can catch up behind it. While the\n * authoritative org is still resolving we stay on the skeleton (or cached\n * rows) - never on the empty state, which must mean \"the server said you have\n * no conversations\", not \"we could not ask yet\".\n */\n const initialLoading = (!orgName || !sessionsLoaded) && snapshotRows.length === 0 && !channelsError;\n /**\n * A failed channels query with nothing cached is an ERROR, not an empty\n * history - during the 2026-09-13 dev outage this screen showed \"No\n * conversations yet\" while the backend was down, which reads as data loss.\n */\n const showErrorState = Boolean(channelsError) && sessions.length === 0;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n const containerStyle = { maxWidth: contentMaxWidth, alignSelf: 'center' as const, width: '100%' as const };\n\n const listFooter = showLoadMore ? (\n <View style={[styles.footer, containerStyle]}>\n <Pressable\n onPress={() => void onLoadMore()}\n disabled={loadingMore}\n style={({ pressed }) => [\n styles.loadMore,\n {\n backgroundColor: theme.loadMoreBg,\n borderColor: theme.loadMoreBorder,\n },\n loadingMore && { opacity: 0.7 },\n pressed && !loadingMore && { opacity: 0.8 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Load older conversations\"\n >\n {loadingMore ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Load older</Text>\n )}\n </Pressable>\n </View>\n ) : !showLoadMore && sessions.length > 0 ? (\n <View style={[styles.endHint, containerStyle]}>\n <View style={[styles.endHintDot, { backgroundColor: theme.endDot, opacity: 0.5 }]} />\n <Text style={[styles.endHintText, { color: theme.muted }]}>{\"You're all caught up\"}</Text>\n </View>\n ) : (\n <View style={{ height: 24 }} />\n );\n\n /**\n * Hairline divider between rows, inset to start where the title column does\n * (past the 40px tile + 14px gap = 54px). Quieter than full-bleed; confirms\n * the column the eye is scanning.\n */\n const renderItemSeparator = React.useCallback(\n () => <View style={[styles.divider, { backgroundColor: theme.divider }]} />,\n [theme.divider],\n );\n\n return (\n <View style={[styles.container, { backgroundColor: theme.bg }]}>\n {initialLoading ? (\n <ChatHistorySkeleton bone={theme.skeleton} />\n ) : showErrorState ? (\n <View style={styles.emptyStateWrap}>\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"cloud-off\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>{\"Couldn't load conversations\"}</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Something went wrong on our side. Your history is safe - try again in a moment.\n </Text>\n <Pressable\n onPress={() => void onRefresh()}\n disabled={refreshing}\n style={({ pressed }) => [\n styles.loadMore,\n styles.retryButton,\n { backgroundColor: theme.loadMoreBg, borderColor: theme.loadMoreBorder },\n (pressed || refreshing) && { opacity: 0.7 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Retry loading conversations\"\n >\n {refreshing ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Try again</Text>\n )}\n </Pressable>\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n {/**\n * Empty-state mark: circular neutral disk with a Lucide-style chat\n * bubble. Uses Feather (same glyph family as the web's lucide-react\n * `MessageCircle`) instead of MCI so the rounded body + tail proportions\n * match the web reference 1:1. Glyph fills ~55% of the disk so it\n * reads as a real focal point, not decoration.\n */}\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"message-circle\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>No conversations yet</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Start your first chat to see your conversation history here.\n </Text>\n </View>\n ) : (\n <SectionList\n sections={sections}\n keyExtractor={(item) => item.channelId}\n stickySectionHeadersEnabled={false}\n initialNumToRender={HISTORY_PAGE_SIZE}\n maxToRenderPerBatch={8}\n windowSize={7}\n updateCellsBatchingPeriod={50}\n removeClippedSubviews\n contentContainerStyle={[styles.listContent, containerStyle, { paddingBottom: 32 }]}\n ListFooterComponent={listFooter}\n ItemSeparatorComponent={renderItemSeparator}\n refreshControl={\n <RefreshControl\n refreshing={refreshing}\n onRefresh={() => void onRefresh()}\n tintColor={theme.refreshTint}\n colors={[theme.refreshTint]}\n />\n }\n renderSectionHeader={({ section }) => (\n <View style={styles.sectionHeader}>\n <Text style={[styles.sectionLabel, { color: theme.sectionLabel }]}>{section.title}</Text>\n </View>\n )}\n renderItem={({ item }) => (\n <ChatHistoryRow\n session={item}\n onSelectSession={onSelectSession}\n theme={theme}\n timeLabel={relativeTime(item.sortAt, nowTs)}\n />\n )}\n showsVerticalScrollIndicator={false}\n />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 20,\n paddingTop: 4,\n },\n /**\n * Section header: sentence case, indigo-tinted, modest size. 28px top padding\n * establishes rhythm between groups without dead air below the label.\n */\n sectionHeader: {\n paddingTop: 28,\n paddingBottom: 10,\n paddingHorizontal: 2,\n },\n sectionLabel: {\n fontSize: 12,\n fontWeight: '700',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n },\n /**\n * Row: leading 40×40 mode tile, two-line body (title + preview), right-aligned\n * date aligned to the title's baseline. 14px gap matches the tile-to-text\n * rhythm in Manus / iOS Mail.\n */\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 2,\n gap: 14,\n },\n tile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n },\n rowHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: 10,\n },\n rowTitle: {\n flex: 1,\n fontSize: 16,\n fontWeight: '600',\n letterSpacing: -0.1,\n lineHeight: 22,\n },\n rowTitlePlaceholder: {\n fontWeight: '500',\n fontStyle: 'italic',\n },\n rowDate: {\n fontSize: 12.5,\n fontWeight: '500',\n fontVariant: ['tabular-nums'],\n },\n rowRunningMeta: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n rowPreview: {\n marginTop: 2,\n fontSize: 13.5,\n lineHeight: 19,\n fontWeight: '400',\n letterSpacing: -0.05,\n },\n /**\n * Indented hairline: starts past the tile column (40 + 14 = 54) so the rule\n * aligns with the title's leading edge. Mail-style.\n */\n divider: {\n height: StyleSheet.hairlineWidth,\n marginLeft: 56,\n },\n footer: {\n paddingTop: 28,\n paddingBottom: 8,\n alignItems: 'center',\n },\n /** Bordered ink-neutral pill. Label is the affordance, no leading icon, no chevron. */\n retryButton: {\n marginTop: 20,\n },\n loadMore: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 10,\n paddingHorizontal: 18,\n borderRadius: 999,\n borderWidth: 1,\n minWidth: 132,\n },\n loadMoreText: {\n fontSize: 13.5,\n fontWeight: '600',\n letterSpacing: -0.05,\n },\n endHint: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n paddingTop: 32,\n paddingBottom: 12,\n },\n endHintDot: {\n width: 4,\n height: 4,\n borderRadius: 2,\n },\n endHintText: {\n fontSize: 12.5,\n fontWeight: '500',\n letterSpacing: 0.1,\n },\n /**\n * Empty state: stack a 64×64 indigo-tinted mark over title + subtitle.\n * Generous vertical gap (16) between mark and title; tighter gap (6)\n * between title and subtitle so the pair reads as one unit hanging off\n * the mark, not three independent items.\n */\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n },\n emptyMark: {\n width: 72,\n height: 72,\n borderRadius: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 18,\n },\n emptyTitle: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.3,\n textAlign: 'center',\n marginBottom: 6,\n },\n emptySubtitle: {\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 340,\n },\n skelBone: {\n borderRadius: 6,\n },\n skelSection: {\n width: 52,\n height: 12,\n borderRadius: 4,\n },\n skelSectionWide: {\n width: 118,\n height: 12,\n borderRadius: 4,\n },\n skelTile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n },\n skelTitle: {\n flex: 1,\n maxWidth: 148,\n height: 14,\n borderRadius: 5,\n },\n skelTitleWide: {\n flex: 1,\n maxWidth: 210,\n height: 14,\n borderRadius: 5,\n },\n skelDate: {\n width: 28,\n height: 11,\n borderRadius: 4,\n },\n skelPreview: {\n marginTop: 8,\n width: '78%',\n height: 11,\n borderRadius: 4,\n },\n skelPreviewShort: {\n marginTop: 8,\n width: '54%',\n height: 11,\n borderRadius: 4,\n },\n});\n"],"names":["d","React","ChatHistoryRow"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from'react';import {BackHandler}from'react-native';import {useFocusEffect}from'@react-navigation/native';import {tryWebBuilderBack}from'./webbuilderBackHandler.js';function WebViewWithNavigation({
|
|
2
2
|
onGoBack
|
|
3
3
|
}) {
|
|
4
|
-
useFocusEffect(
|
|
4
|
+
useFocusEffect(React__default.useCallback(() => {
|
|
5
5
|
const onBackPress = () => {
|
|
6
6
|
if (tryWebBuilderBack()) {
|
|
7
7
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebViewWithNavigation.js","sources":["../../../src/screens/WebBuilder/WebViewWithNavigation.tsx"],"sourcesContent":["import React from 'react';\nimport { BackHandler } from 'react-native';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { tryWebBuilderBack } from './webbuilderBackHandler';\n\n/**\n * Hardware back: dismiss in-app preview if open, otherwise leave WebBuilder.\n */\nexport function WebViewWithNavigation({\n onGoBack,\n}: {\n /** Kept for call-site compatibility; SPA history is no longer used. */\n webViewRef?: React.RefObject<unknown>;\n canGoBack?: boolean;\n onGoBack: () => void;\n}): null {\n useFocusEffect(\n React.useCallback(() => {\n const onBackPress = () => {\n // Preview dismiss only (via setWebBuilderBackHandler). SPA history\n // must not trap Android back on this screen.\n if (tryWebBuilderBack()) {\n return true;\n }\n onGoBack();\n return true;\n };\n\n const subscription = BackHandler.addEventListener('hardwareBackPress', onBackPress);\n return () => subscription.remove();\n }, [onGoBack]),\n );\n\n return null;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WebViewWithNavigation.js","sources":["../../../src/screens/WebBuilder/WebViewWithNavigation.tsx"],"sourcesContent":["import React from 'react';\nimport { BackHandler } from 'react-native';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { tryWebBuilderBack } from './webbuilderBackHandler';\n\n/**\n * Hardware back: dismiss in-app preview if open, otherwise leave WebBuilder.\n */\nexport function WebViewWithNavigation({\n onGoBack,\n}: {\n /** Kept for call-site compatibility; SPA history is no longer used. */\n webViewRef?: React.RefObject<unknown>;\n canGoBack?: boolean;\n onGoBack: () => void;\n}): null {\n useFocusEffect(\n React.useCallback(() => {\n const onBackPress = () => {\n // Preview dismiss only (via setWebBuilderBackHandler). SPA history\n // must not trap Android back on this screen.\n if (tryWebBuilderBack()) {\n return true;\n }\n onGoBack();\n return true;\n };\n\n const subscription = BackHandler.addEventListener('hardwareBackPress', onBackPress);\n return () => subscription.remove();\n }, [onGoBack]),\n );\n\n return null;\n}\n"],"names":["React"],"mappings":"0LAQO,SAAS,qBAAsB,CAAA;AAAA,EACpC;AACF,CAKS,EAAA;AACP,EAAe,cAAA,CAAAA,cAAA,CAAM,YAAY,MAAM;AACrC,IAAA,MAAM,cAAc,MAAM;AAGxB,MAAA,IAAI,mBAAqB,EAAA;AACvB,QAAO,OAAA,IAAA;AAAA;AAET,MAAS,QAAA,EAAA;AACT,MAAO,OAAA,IAAA;AAAA,KACT;AACA,IAAA,MAAM,YAAe,GAAA,WAAA,CAAY,gBAAiB,CAAA,mBAAA,EAAqB,WAAW,CAAA;AAClF,IAAO,OAAA,MAAM,aAAa,MAAO,EAAA;AAAA,GAChC,EAAA,CAAC,QAAQ,CAAC,CAAC,CAAA;AACd,EAAO,OAAA,IAAA;AACT"}
|
|
@@ -159,4 +159,41 @@ async function parseShoppingViaBrain(text, opts = {}) {
|
|
|
159
159
|
"status"
|
|
160
160
|
]);
|
|
161
161
|
return rest;
|
|
162
|
-
}
|
|
162
|
+
}
|
|
163
|
+
const BRAIN_COMPLETE_PATH = "/resources/yantra-brain-complete";
|
|
164
|
+
async function brainCompleteViaBrain(messages, opts = {}) {
|
|
165
|
+
var _a, _b;
|
|
166
|
+
const base = (config.CLIENT_URL || "").trim().replace(/\/+$/, "");
|
|
167
|
+
const endpoint = base ? `${base}${BRAIN_COMPLETE_PATH}` : "";
|
|
168
|
+
if (!endpoint || messages.length === 0) return null;
|
|
169
|
+
const controller = new AbortController();
|
|
170
|
+
const timeout = setTimeout(() => controller.abort(), (_a = opts.timeoutMs) != null ? _a : 15e3);
|
|
171
|
+
if (opts.signal) {
|
|
172
|
+
if (opts.signal.aborted) controller.abort();
|
|
173
|
+
else opts.signal.addEventListener("abort", () => controller.abort(), {
|
|
174
|
+
once: true
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const res = await fetch(endpoint, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
headers: {
|
|
181
|
+
"Content-Type": "application/json"
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({
|
|
184
|
+
messages,
|
|
185
|
+
model: "yantra-brain/fast",
|
|
186
|
+
max_tokens: (_b = opts.maxTokens) != null ? _b : 220
|
|
187
|
+
}),
|
|
188
|
+
signal: controller.signal
|
|
189
|
+
});
|
|
190
|
+
if (!res.ok) return null;
|
|
191
|
+
const data = await res.json();
|
|
192
|
+
const content = typeof (data == null ? void 0 : data.content) === "string" ? data.content.trim() : "";
|
|
193
|
+
return content || null;
|
|
194
|
+
} catch (e) {
|
|
195
|
+
return null;
|
|
196
|
+
} finally {
|
|
197
|
+
clearTimeout(timeout);
|
|
198
|
+
}
|
|
199
|
+
}export{brainCompleteViaBrain,brainEndpoint,classifyIntentViaBrain,classifyShoppingViaBrain,parseShoppingViaBrain,quickReplyViaBrain};//# sourceMappingURL=brainQuickReply.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport interface BrainIntent {\n intent: string;\n confidence?: number;\n}\n\nconst CLASSIFY_TIMEOUT_MS = 2000;\n\nasync function postBrainJson(\n text: string,\n extra: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<Record<string, unknown> | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), ...extra }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** cdecli yantra-brain classify — same default task as web intentRouter. */\nexport async function classifyIntentViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<BrainIntent | null> {\n const data = await postBrainJson(text, {}, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const intent = typeof data?.intent === 'string' ? data.intent.trim().toLowerCase() : '';\n if (!intent) return null;\n return {\n intent,\n confidence: typeof data?.confidence === 'number' ? data.confidence : undefined,\n };\n}\n\n/** cdecli shopping parse — `task: 'shopping'`. */\nexport type ShoppingBrainVerdict =\n | { status: 'unreachable' }\n | { status: 'declined' }\n | {\n status: 'ok';\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n };\n\nexport async function classifyShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<ShoppingBrainVerdict> {\n const data = await postBrainJson(text, { task: 'shopping' }, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n if (!data) return { status: 'unreachable' };\n if (data.intent === null || data.intent === undefined) return { status: 'declined' };\n const payload = data.intent;\n if (!payload || typeof payload !== 'object') return { status: 'declined' };\n const row = payload as Record<string, unknown>;\n const query = typeof row.query === 'string' ? row.query.trim() : '';\n const monitorRaw = typeof row.monitor === 'string' ? row.monitor.trim().toLowerCase() : '';\n const monitor = monitorRaw === 'watch' || monitorRaw === 'stop' ? monitorRaw : undefined;\n if (!query && !monitor) return { status: 'declined' };\n return {\n status: 'ok',\n query,\n ...(typeof row.productType === 'string' && row.productType.trim()\n ? { productType: row.productType.trim().toLowerCase() }\n : {}),\n ...(Array.isArray(row.synonyms)\n ? {\n synonyms: row.synonyms\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(Array.isArray(row.excludes)\n ? {\n excludes: row.excludes\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(monitor ? { monitor } : {}),\n ...(typeof row.targetPrice === 'number' && row.targetPrice > 0 ? { targetPrice: row.targetPrice } : {}),\n ...(typeof row.budget === 'number' && row.budget > 0 ? { budget: Math.round(row.budget) } : {}),\n ...(typeof row.departmentId === 'string' && row.departmentId.trim()\n ? { departmentId: row.departmentId.trim().toLowerCase() }\n : {}),\n };\n}\n\nexport async function parseShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<{\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n} | null> {\n const verdict = await classifyShoppingViaBrain(text, opts);\n if (verdict.status !== 'ok') return null;\n // Destructured only to leave `status` out of what is returned.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { status: _status, ...rest } = verdict;\n return rest;\n}\n\nconst BRAIN_COMPLETE_PATH = '/resources/yantra-brain-complete';\n\n/** Keyless chat completion via the same web origin as the classify proxy. */\nexport async function brainCompleteViaBrain(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n opts: { maxTokens?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n const endpoint = base ? `${base}${BRAIN_COMPLETE_PATH}` : '';\n if (!endpoint || messages.length === 0) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n model: 'yantra-brain/fast',\n max_tokens: opts.maxTokens ?? 220,\n }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: string | null };\n const content = typeof data?.content === 'string' ? data.content.trim() : '';\n return content || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport interface BrainIntent {\n intent: string;\n confidence?: number;\n}\n\nconst CLASSIFY_TIMEOUT_MS = 2000;\n\nasync function postBrainJson(\n text: string,\n extra: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<Record<string, unknown> | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), ...extra }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** cdecli yantra-brain classify — same default task as web intentRouter. */\nexport async function classifyIntentViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<BrainIntent | null> {\n const data = await postBrainJson(text, {}, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const intent = typeof data?.intent === 'string' ? data.intent.trim().toLowerCase() : '';\n if (!intent) return null;\n return {\n intent,\n confidence: typeof data?.confidence === 'number' ? data.confidence : undefined,\n };\n}\n\n/** cdecli shopping parse — `task: 'shopping'`. */\nexport type ShoppingBrainVerdict =\n | { status: 'unreachable' }\n | { status: 'declined' }\n | {\n status: 'ok';\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n };\n\nexport async function classifyShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<ShoppingBrainVerdict> {\n const data = await postBrainJson(text, { task: 'shopping' }, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n if (!data) return { status: 'unreachable' };\n if (data.intent === null || data.intent === undefined) return { status: 'declined' };\n const payload = data.intent;\n if (!payload || typeof payload !== 'object') return { status: 'declined' };\n const row = payload as Record<string, unknown>;\n const query = typeof row.query === 'string' ? row.query.trim() : '';\n const monitorRaw = typeof row.monitor === 'string' ? row.monitor.trim().toLowerCase() : '';\n const monitor = monitorRaw === 'watch' || monitorRaw === 'stop' ? monitorRaw : undefined;\n if (!query && !monitor) return { status: 'declined' };\n return {\n status: 'ok',\n query,\n ...(typeof row.productType === 'string' && row.productType.trim()\n ? { productType: row.productType.trim().toLowerCase() }\n : {}),\n ...(Array.isArray(row.synonyms)\n ? {\n synonyms: row.synonyms\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(Array.isArray(row.excludes)\n ? {\n excludes: row.excludes\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(monitor ? { monitor } : {}),\n ...(typeof row.targetPrice === 'number' && row.targetPrice > 0 ? { targetPrice: row.targetPrice } : {}),\n ...(typeof row.budget === 'number' && row.budget > 0 ? { budget: Math.round(row.budget) } : {}),\n ...(typeof row.departmentId === 'string' && row.departmentId.trim()\n ? { departmentId: row.departmentId.trim().toLowerCase() }\n : {}),\n };\n}\n\nexport async function parseShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<{\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n} | null> {\n const verdict = await classifyShoppingViaBrain(text, opts);\n if (verdict.status !== 'ok') return null;\n // Destructured only to leave `status` out of what is returned.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { status: _status, ...rest } = verdict;\n return rest;\n}\n\nconst BRAIN_COMPLETE_PATH = '/resources/yantra-brain-complete';\n\n/** Keyless chat completion via the same web origin as the classify proxy. */\nexport async function brainCompleteViaBrain(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n opts: { maxTokens?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n const endpoint = base ? `${base}${BRAIN_COMPLETE_PATH}` : '';\n if (!endpoint || messages.length === 0) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n model: 'yantra-brain/fast',\n max_tokens: opts.maxTokens ?? 220,\n }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: string | null };\n const content = typeof data?.content === 'string' ? data.content.trim() : '';\n return content || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.69-alpha.
|
|
3
|
+
"version": "12.0.69-alpha.15",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
42
|
"@react-native-async-storage/async-storage": "*",
|
|
43
43
|
"@react-navigation/native": "*",
|
|
44
|
-
"common": "12.0.69-alpha.
|
|
44
|
+
"common": "12.0.69-alpha.12",
|
|
45
45
|
"expo-constants": "*",
|
|
46
46
|
"expo-secure-store": "*",
|
|
47
47
|
"expo-web-browser": "*",
|
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
"typescript": {
|
|
59
59
|
"definition": "lib/index.d.ts"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "90eef68fd5da16fd662a700f078d254e5bcf4073"
|
|
62
62
|
}
|