@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.69
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/config/env-config.js +4 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/ChatLiveStreamContext.js +4 -1
- package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +2 -0
- package/lib/features/agent-chat/NativeAgentChat.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/chat/ChatCodeBlock.js +7 -3
- package/lib/features/chat/ChatCodeBlock.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +7 -3
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/ChatWidgetCard.js +13 -0
- package/lib/features/chat/ChatWidgetCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectCard.js +164 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
- package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
- package/lib/features/chat/MessageActionBar.js.map +1 -1
- package/lib/features/chat/QueuedFollowUps.js +71 -0
- package/lib/features/chat/QueuedFollowUps.js.map +1 -0
- package/lib/features/chat/chatWidgets.js +37 -0
- package/lib/features/chat/chatWidgets.js.map +1 -0
- package/lib/features/chat/connectorConnect.js +179 -0
- package/lib/features/chat/connectorConnect.js.map +1 -0
- package/lib/features/chat/connectorConnectHandbacks.js +55 -0
- package/lib/features/chat/connectorConnectHandbacks.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 +116 -0
- package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
- package/lib/features/messaging/ContactsScreen.js +288 -0
- package/lib/features/messaging/ContactsScreen.js.map +1 -0
- package/lib/features/messaging/ConversationListScreen.js +147 -0
- package/lib/features/messaging/ConversationListScreen.js.map +1 -0
- package/lib/features/messaging/MessageActions.js +290 -0
- package/lib/features/messaging/MessageActions.js.map +1 -0
- package/lib/features/messaging/NativeChatExperience.js +189 -0
- package/lib/features/messaging/NativeChatExperience.js.map +1 -0
- package/lib/features/messaging/RegistrationScreen.js +11 -14
- 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 +106 -1
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/emojiCatalog.js +60 -0
- package/lib/features/messaging/emojiCatalog.js.map +1 -0
- package/lib/features/messaging/emojiKeywords.js +1592 -0
- package/lib/features/messaging/emojiKeywords.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 +191 -0
- package/lib/features/messaging/useContactMatches.js.map +1 -0
- package/lib/features/messaging/usePhoneVerification.js +12 -12
- 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/useCdecliChannel.js +128 -6
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +4 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +77 -63
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +24 -0
- package/lib/hooks/useHostConnectorCard.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/Chat/index.js +51 -22
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatNative/index.js +13 -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/JobSearchNative/useJobSearchHostChat.js +12 -6
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
- package/lib/screens/TravelNative/useTravelHostChat.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/lib/state/chatThreadMerge.js +6 -1
- package/lib/state/chatThreadMerge.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import {departmentBadge}from'../catalog.js';import {invokeShoppingSearchConnector,SHOPPING_SEARCH_ACTIONS}from'./shoppingSearchConnectorClient.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
async function searchCatalogDeals(query) {
|
|
21
|
+
var _a, _b, _c, _d, _e;
|
|
22
|
+
const result = await invokeShoppingSearchConnector(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues({}, query.minDiscount !== void 0 ? {
|
|
23
|
+
minDiscount: query.minDiscount
|
|
24
|
+
} : {}), query.maxPrice !== void 0 ? {
|
|
25
|
+
maxPrice: query.maxPrice
|
|
26
|
+
} : {}), query.minRating !== void 0 ? {
|
|
27
|
+
minRating: query.minRating
|
|
28
|
+
} : {}), query.inStock ? {
|
|
29
|
+
inStock: true
|
|
30
|
+
} : {}), {
|
|
31
|
+
sort: (_a = query.sort) != null ? _a : "discount",
|
|
32
|
+
limit: (_b = query.limit) != null ? _b : 24
|
|
33
|
+
}), SHOPPING_SEARCH_ACTIONS.DEALS);
|
|
34
|
+
if (!result.success) throw new Error(result.error || "Deal search failed");
|
|
35
|
+
const dept = departmentBadge();
|
|
36
|
+
const products = ((_d = (_c = result.data) == null ? void 0 : _c.deals) != null ? _d : []).map((row, index) => {
|
|
37
|
+
var _a2, _b2, _c2;
|
|
38
|
+
const name = String((_a2 = row.product_name) != null ? _a2 : "").trim();
|
|
39
|
+
if (!name) return null;
|
|
40
|
+
const url = typeof row.product_url === "string" ? row.product_url.trim() : void 0;
|
|
41
|
+
return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues({
|
|
42
|
+
id: `deal-${(_b2 = row.retailer_id) != null ? _b2 : "x"}-${(_c2 = row.product_id) != null ? _c2 : index}`,
|
|
43
|
+
name,
|
|
44
|
+
departmentId: dept.id,
|
|
45
|
+
price: typeof row.current_price === "number" ? row.current_price : 0,
|
|
46
|
+
rating: typeof row.rating === "number" ? Math.min(5, Math.max(0, row.rating)) : 0,
|
|
47
|
+
reviews: 0,
|
|
48
|
+
icon: "\u{1F6CD}",
|
|
49
|
+
accent: "#94a3b8"
|
|
50
|
+
}, url ? {
|
|
51
|
+
url
|
|
52
|
+
} : {}), {
|
|
53
|
+
source: "catalog"
|
|
54
|
+
}), typeof row.original_price === "number" ? {
|
|
55
|
+
originalPrice: row.original_price
|
|
56
|
+
} : {}), typeof row.discount_percentage === "number" ? {
|
|
57
|
+
discountPercent: row.discount_percentage
|
|
58
|
+
} : {}), typeof row.in_stock === "boolean" ? {
|
|
59
|
+
inStock: row.in_stock
|
|
60
|
+
} : {}), row.brand ? {
|
|
61
|
+
brand: String(row.brand)
|
|
62
|
+
} : {}), row.retailer_id ? {
|
|
63
|
+
retailerId: String(row.retailer_id)
|
|
64
|
+
} : {}), row.product_id ? {
|
|
65
|
+
sku: String(row.product_id)
|
|
66
|
+
} : {});
|
|
67
|
+
}).filter((p) => p !== null);
|
|
68
|
+
return __spreadValues({
|
|
69
|
+
products
|
|
70
|
+
}, ((_e = result.data) == null ? void 0 : _e.hint) ? {
|
|
71
|
+
hint: result.data.hint
|
|
72
|
+
} : {});
|
|
73
|
+
}
|
|
74
|
+
async function fetchWatchStatus() {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
const result = await invokeShoppingSearchConnector({}, SHOPPING_SEARCH_ACTIONS.WATCH_STATUS);
|
|
77
|
+
if (!result.success) throw new Error(result.error || "Could not read the watchlist");
|
|
78
|
+
return __spreadValues({
|
|
79
|
+
rows: ((_b = (_a = result.data) == null ? void 0 : _a.watched) != null ? _b : []).map((row) => {
|
|
80
|
+
var _a2, _b2;
|
|
81
|
+
return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
82
|
+
retailerId: String((_a2 = row.retailer_id) != null ? _a2 : ""),
|
|
83
|
+
productId: String((_b2 = row.product_id) != null ? _b2 : "")
|
|
84
|
+
}, typeof row.current_price === "number" ? {
|
|
85
|
+
currentPrice: row.current_price
|
|
86
|
+
} : {}), typeof row.previous_price === "number" ? {
|
|
87
|
+
previousPrice: row.previous_price
|
|
88
|
+
} : {}), typeof row.delta === "number" ? {
|
|
89
|
+
delta: row.delta
|
|
90
|
+
} : {}), typeof row.target_price === "number" ? {
|
|
91
|
+
targetPrice: row.target_price
|
|
92
|
+
} : {}), typeof row.hit_target === "boolean" ? {
|
|
93
|
+
hitTarget: row.hit_target
|
|
94
|
+
} : {});
|
|
95
|
+
})
|
|
96
|
+
}, ((_c = result.data) == null ? void 0 : _c.hint) ? {
|
|
97
|
+
hint: result.data.hint
|
|
98
|
+
} : {});
|
|
99
|
+
}
|
|
100
|
+
async function addPriceWatch(params) {
|
|
101
|
+
const result = await invokeShoppingSearchConnector(__spreadValues({
|
|
102
|
+
retailer: params.retailer,
|
|
103
|
+
productId: params.productId
|
|
104
|
+
}, params.targetPrice !== void 0 ? {
|
|
105
|
+
targetPrice: params.targetPrice
|
|
106
|
+
} : {}), SHOPPING_SEARCH_ACTIONS.WATCH_ADD);
|
|
107
|
+
if (!result.success) throw new Error(result.error || "Could not add the price watch");
|
|
108
|
+
}
|
|
109
|
+
async function fetchPriceHistory(params) {
|
|
110
|
+
var _a, _b, _c;
|
|
111
|
+
const result = await invokeShoppingSearchConnector({
|
|
112
|
+
retailer: params.retailer,
|
|
113
|
+
productId: params.productId,
|
|
114
|
+
weeks: (_a = params.weeks) != null ? _a : 26
|
|
115
|
+
}, SHOPPING_SEARCH_ACTIONS.PRICE_HISTORY);
|
|
116
|
+
if (!result.success) throw new Error(result.error || "Price history failed");
|
|
117
|
+
const raw = (_b = result.data) == null ? void 0 : _b.series;
|
|
118
|
+
const points = Array.isArray(raw) ? raw : (_c = raw == null ? void 0 : raw.series) != null ? _c : [];
|
|
119
|
+
const PRICE_KEYS = ["amz_buy_box", "amz_3p_new", "amz_retail", "walmart_price", "price"];
|
|
120
|
+
return points.map((point) => {
|
|
121
|
+
var _a2;
|
|
122
|
+
const ts = String((_a2 = point.ts) != null ? _a2 : "");
|
|
123
|
+
if (!ts) return null;
|
|
124
|
+
for (const key of PRICE_KEYS) {
|
|
125
|
+
const value = point[key];
|
|
126
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0) return {
|
|
127
|
+
ts,
|
|
128
|
+
price: value
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}).filter((p) => p !== null);
|
|
133
|
+
}
|
|
134
|
+
async function compareRetailers(params) {
|
|
135
|
+
var _a, _b, _c, _d;
|
|
136
|
+
const result = await invokeShoppingSearchConnector({
|
|
137
|
+
identifier: params.identifier,
|
|
138
|
+
lookupType: params.lookupType,
|
|
139
|
+
limit: 25
|
|
140
|
+
}, SHOPPING_SEARCH_ACTIONS.COMPARE);
|
|
141
|
+
if (!result.success) throw new Error(result.error || "Compare failed");
|
|
142
|
+
const data = (_a = result.data) != null ? _a : {};
|
|
143
|
+
return __spreadValues({
|
|
144
|
+
identifier: (_b = data.identifier) != null ? _b : params.identifier,
|
|
145
|
+
lookupType: (_c = data.lookupType) != null ? _c : params.lookupType,
|
|
146
|
+
rows: ((_d = data.results) != null ? _d : []).map((row) => {
|
|
147
|
+
var _a2, _b2;
|
|
148
|
+
return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
149
|
+
retailerId: String((_a2 = row.retailer_id) != null ? _a2 : ""),
|
|
150
|
+
productId: String((_b2 = row.product_id) != null ? _b2 : "")
|
|
151
|
+
}, row.product_name ? {
|
|
152
|
+
productName: String(row.product_name)
|
|
153
|
+
} : {}), typeof row.current_price === "number" ? {
|
|
154
|
+
currentPrice: row.current_price
|
|
155
|
+
} : {}), typeof row.in_stock === "boolean" ? {
|
|
156
|
+
inStock: row.in_stock
|
|
157
|
+
} : {}), typeof row.delta_to_cheapest === "number" ? {
|
|
158
|
+
deltaToCheapest: row.delta_to_cheapest
|
|
159
|
+
} : {}), row.product_url ? {
|
|
160
|
+
productUrl: String(row.product_url)
|
|
161
|
+
} : {});
|
|
162
|
+
})
|
|
163
|
+
}, data.hint ? {
|
|
164
|
+
hint: data.hint
|
|
165
|
+
} : {});
|
|
166
|
+
}export{addPriceWatch,compareRetailers,fetchPriceHistory,fetchWatchStatus,searchCatalogDeals};//# sourceMappingURL=catalogActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogActions.js","sources":["../../../../src/features/shopping/services/catalogActions.ts"],"sourcesContent":["import { departmentBadge, type Product } from '../catalog';\nimport { invokeShoppingSearchConnector, SHOPPING_SEARCH_ACTIONS } from './shoppingSearchConnectorClient';\n\nexport interface DealsQuery {\n minDiscount?: number;\n maxPrice?: number;\n minRating?: number;\n inStock?: boolean;\n sort?: 'discount' | 'price';\n limit?: number;\n}\n\nexport interface WatchRow {\n retailerId: string;\n productId: string;\n currentPrice?: number;\n previousPrice?: number;\n delta?: number;\n targetPrice?: number;\n hitTarget?: boolean;\n}\n\nexport interface CompareRow {\n retailerId: string;\n productId: string;\n productName?: string;\n currentPrice?: number;\n inStock?: boolean;\n deltaToCheapest?: number;\n productUrl?: string;\n}\n\nexport async function searchCatalogDeals(query: DealsQuery): Promise<{ products: Product[]; hint?: string }> {\n const result = await invokeShoppingSearchConnector<{\n deals?: Array<Record<string, unknown>>;\n hint?: string;\n }>(\n {\n ...(query.minDiscount !== undefined ? { minDiscount: query.minDiscount } : {}),\n ...(query.maxPrice !== undefined ? { maxPrice: query.maxPrice } : {}),\n ...(query.minRating !== undefined ? { minRating: query.minRating } : {}),\n ...(query.inStock ? { inStock: true } : {}),\n sort: query.sort ?? 'discount',\n limit: query.limit ?? 24,\n },\n SHOPPING_SEARCH_ACTIONS.DEALS,\n );\n if (!result.success) throw new Error(result.error || 'Deal search failed');\n const dept = departmentBadge();\n const products = (result.data?.deals ?? [])\n .map((row, index): Product | null => {\n const name = String(row.product_name ?? '').trim();\n if (!name) return null;\n const url = typeof row.product_url === 'string' ? row.product_url.trim() : undefined;\n return {\n id: `deal-${row.retailer_id ?? 'x'}-${row.product_id ?? index}`,\n name,\n departmentId: dept.id,\n price: typeof row.current_price === 'number' ? row.current_price : 0,\n rating: typeof row.rating === 'number' ? Math.min(5, Math.max(0, row.rating)) : 0,\n reviews: 0,\n icon: '\\u{1F6CD}',\n accent: '#94a3b8',\n ...(url ? { url } : {}),\n source: 'catalog',\n ...(typeof row.original_price === 'number' ? { originalPrice: row.original_price } : {}),\n ...(typeof row.discount_percentage === 'number' ? { discountPercent: row.discount_percentage } : {}),\n ...(typeof row.in_stock === 'boolean' ? { inStock: row.in_stock } : {}),\n ...(row.brand ? { brand: String(row.brand) } : {}),\n ...(row.retailer_id ? { retailerId: String(row.retailer_id) } : {}),\n ...(row.product_id ? { sku: String(row.product_id) } : {}),\n };\n })\n .filter((p): p is Product => p !== null);\n return { products, ...(result.data?.hint ? { hint: result.data.hint } : {}) };\n}\n\nexport async function fetchWatchStatus(): Promise<{ rows: WatchRow[]; hint?: string }> {\n const result = await invokeShoppingSearchConnector<{\n watched?: Array<Record<string, unknown>>;\n hint?: string;\n }>({}, SHOPPING_SEARCH_ACTIONS.WATCH_STATUS);\n if (!result.success) throw new Error(result.error || 'Could not read the watchlist');\n return {\n rows: (result.data?.watched ?? []).map((row) => ({\n retailerId: String(row.retailer_id ?? ''),\n productId: String(row.product_id ?? ''),\n ...(typeof row.current_price === 'number' ? { currentPrice: row.current_price } : {}),\n ...(typeof row.previous_price === 'number' ? { previousPrice: row.previous_price } : {}),\n ...(typeof row.delta === 'number' ? { delta: row.delta } : {}),\n ...(typeof row.target_price === 'number' ? { targetPrice: row.target_price } : {}),\n ...(typeof row.hit_target === 'boolean' ? { hitTarget: row.hit_target } : {}),\n })),\n ...(result.data?.hint ? { hint: result.data.hint } : {}),\n };\n}\n\nexport async function addPriceWatch(params: {\n retailer: string;\n productId: string;\n targetPrice?: number;\n}): Promise<void> {\n const result = await invokeShoppingSearchConnector(\n {\n retailer: params.retailer,\n productId: params.productId,\n ...(params.targetPrice !== undefined ? { targetPrice: params.targetPrice } : {}),\n },\n SHOPPING_SEARCH_ACTIONS.WATCH_ADD,\n );\n if (!result.success) throw new Error(result.error || 'Could not add the price watch');\n}\n\nexport interface PricePoint {\n ts: string;\n price: number;\n}\n\nexport async function fetchPriceHistory(params: {\n retailer: string;\n productId: string;\n weeks?: number;\n}): Promise<PricePoint[]> {\n const result = await invokeShoppingSearchConnector<{\n series?: { series?: Array<Record<string, unknown>> } | Array<Record<string, unknown>>;\n }>(\n { retailer: params.retailer, productId: params.productId, weeks: params.weeks ?? 26 },\n SHOPPING_SEARCH_ACTIONS.PRICE_HISTORY,\n );\n if (!result.success) throw new Error(result.error || 'Price history failed');\n const raw = result.data?.series;\n const points = Array.isArray(raw) ? raw : (raw?.series ?? []);\n const PRICE_KEYS = ['amz_buy_box', 'amz_3p_new', 'amz_retail', 'walmart_price', 'price'];\n return points\n .map((point): PricePoint | null => {\n const ts = String(point.ts ?? '');\n if (!ts) return null;\n for (const key of PRICE_KEYS) {\n const value = point[key];\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) return { ts, price: value };\n }\n return null;\n })\n .filter((p): p is PricePoint => p !== null);\n}\n\nexport async function compareRetailers(params: {\n identifier: string;\n lookupType: string;\n}): Promise<{ rows: CompareRow[]; hint?: string; identifier: string; lookupType: string }> {\n const result = await invokeShoppingSearchConnector<{\n identifier?: string;\n lookupType?: string;\n results?: Array<Record<string, unknown>>;\n hint?: string;\n }>({ identifier: params.identifier, lookupType: params.lookupType, limit: 25 }, SHOPPING_SEARCH_ACTIONS.COMPARE);\n if (!result.success) throw new Error(result.error || 'Compare failed');\n const data = result.data ?? {};\n return {\n identifier: data.identifier ?? params.identifier,\n lookupType: data.lookupType ?? params.lookupType,\n rows: (data.results ?? []).map((row) => ({\n retailerId: String(row.retailer_id ?? ''),\n productId: String(row.product_id ?? ''),\n ...(row.product_name ? { productName: String(row.product_name) } : {}),\n ...(typeof row.current_price === 'number' ? { currentPrice: row.current_price } : {}),\n ...(typeof row.in_stock === 'boolean' ? { inStock: row.in_stock } : {}),\n ...(typeof row.delta_to_cheapest === 'number' ? { deltaToCheapest: row.delta_to_cheapest } : {}),\n ...(row.product_url ? { productUrl: String(row.product_url) } : {}),\n })),\n ...(data.hint ? { hint: data.hint } : {}),\n };\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {normalizeShoppingQuery}from'./parseShoppingIntent.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const EDGE_L = "(^|[^A-Za-z0-9/_-])";
|
|
18
|
+
const EDGE_R = "(?![A-Za-z0-9/_-])";
|
|
19
|
+
const MONITOR_PATTERNS = [new RegExp(`${EDGE_L}(?:run|do|set\\s*up|start|schedule|create)?\\s*(?:an?\\s+)?(?:hourly\\s+)?price[- ]?check(?:s)?(?:\\s+(?:on|for|of))?${EDGE_R}`, "i"), new RegExp(`${EDGE_L}check(?:\\s+(?:on|up\\s+on))?\\s+(?:the\\s+|its\\s+|that\\s+)?price(?:s)?(?:\\s+(?:of|for|on))?${EDGE_R}`, "i"), new RegExp(`${EDGE_L}(?:watch|track|monitor|follow)\\s+(?:the\\s+|its\\s+)?price(?:s)?(?:\\s+(?:of|for|on))?${EDGE_R}`, "i"), new RegExp(`${EDGE_L}keep\\s+(?:an?\\s+eye\\s+on|watch(?:ing)?(?:\\s+(?:of|on))?|track(?:ing)?\\s+of)\\s+(?:the\\s+)?price(?:s)?(?:\\s+(?:of|for|on))?${EDGE_R}`, "i"), new RegExp(`${EDGE_L}(?:set(?:\\s*up)?\\s+)?(?:an?\\s+)?price\\s+alert(?:s)?(?:\\s+(?:on|for|of))?${EDGE_R}`, "i"), new RegExp(`${EDGE_L}(?:alert|notify|tell|ping|let)\\s+(?:me|us)(?:\\s+know)?\\s+(?:when|if|once)\\s+(?:the\\s+)?(?:price(?:\\s+(?:of|for|on))?\\s*)?(?:it\\s+)?(?:drops?|falls?|goes\\s+(?:down|below|under)|dips?|is\\s+(?:lower|cheaper)|gets?\\s+cheaper|hits)?${EDGE_R}`, "i")];
|
|
20
|
+
const TARGET_PATTERNS = [/\b(?:drops?|falls?|goes|dips?|gets?)\s+(?:down\s+)?(?:below|under|to|past)\s+\$?\s*(\d+(?:\.\d+)?)/i, /\b(?:below|under)\s+\$?\s*(\d+(?:\.\d+)?)/i, /\bhits?\s+\$?\s*(\d+(?:\.\d+)?)/i, /\btarget(?:\s+price)?\s*(?:of|is|:|at)?\s*\$?\s*(\d+(?:\.\d+)?)/i, /\b(?:at|to)\s+\$\s*(\d+(?:\.\d+)?)/i];
|
|
21
|
+
const CONDITION_TAILS = [/\b(?:when|if|once)\s+(?:it|the\s+price|they)?\s*(?:drops?|falls?|goes|dips?|gets?|hits?|is)\b[^,.;]*/gi, /\b(?:drops?|falls?|goes)\s+(?:down\s+)?(?:below|under|to|past)\s+\$?\s*\d+(?:\.\d+)?/gi, /\b(?:below|under|to|at)\s+\$\s*\d+(?:\.\d+)?/gi, /\btarget(?:\s+price)?\s*(?:of|is|:|at)?\s*\$?\s*\d+(?:\.\d+)?/gi, /\b(?:every|each)\s+(?:hour|day|hr)\b/gi, /\bhourly\b/gi];
|
|
22
|
+
const STOP_PATTERN = new RegExp(`${EDGE_L}(?:stop|pause|cancel|end|kill|turn\\s+off|disable|remove)${EDGE_R}[\\s\\S]{0,40}?${EDGE_L}(?:price[- ]?check(?:s)?|price\\s+(?:watch(?:es)?|alert(?:s)?|monitor(?:ing)?)|(?:watching|tracking|monitoring)\\s+(?:the\\s+)?price(?:s)?)${EDGE_R}`, "i");
|
|
23
|
+
function parsePriceCheckTarget(text) {
|
|
24
|
+
for (const pattern of TARGET_PATTERNS) {
|
|
25
|
+
const match = text.match(pattern);
|
|
26
|
+
if (!match) continue;
|
|
27
|
+
const value = Number.parseFloat(match[1]);
|
|
28
|
+
if (Number.isFinite(value) && value > 0) return value;
|
|
29
|
+
}
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
function parsePriceCheckStop(text) {
|
|
33
|
+
return STOP_PATTERN.test((text || "").trim());
|
|
34
|
+
}
|
|
35
|
+
function parsePriceCheckIntent(text) {
|
|
36
|
+
var _a;
|
|
37
|
+
const trimmed = (text || "").trim();
|
|
38
|
+
if (trimmed.length < 4) return null;
|
|
39
|
+
if (parsePriceCheckStop(trimmed)) return null;
|
|
40
|
+
if (/^(?:what|whats|what's|how\s+much|how\s+many)\b/i.test(trimmed)) return null;
|
|
41
|
+
const matched = MONITOR_PATTERNS.find((pattern) => pattern.test(trimmed));
|
|
42
|
+
if (!matched) return null;
|
|
43
|
+
const targetPrice = parsePriceCheckTarget(trimmed);
|
|
44
|
+
let remainder = trimmed;
|
|
45
|
+
for (const pattern of MONITOR_PATTERNS) {
|
|
46
|
+
remainder = remainder.replace(new RegExp(pattern.source, "gi"), " ");
|
|
47
|
+
}
|
|
48
|
+
for (const pattern of CONDITION_TAILS) {
|
|
49
|
+
remainder = remainder.replace(pattern, " ");
|
|
50
|
+
}
|
|
51
|
+
remainder = remainder.replace(/\s{2,}/g, " ").trim().replace(/[,;]?\s*(?:and|or|then|also)\s*$/i, "").replace(/^(?:and|or|then|also)\s+/i, "").trim();
|
|
52
|
+
const normalized = normalizeShoppingQuery(remainder);
|
|
53
|
+
return __spreadValues({
|
|
54
|
+
query: (_a = normalized == null ? void 0 : normalized.query) != null ? _a : ""
|
|
55
|
+
}, targetPrice !== void 0 ? {
|
|
56
|
+
targetPrice
|
|
57
|
+
} : {});
|
|
58
|
+
}export{parsePriceCheckIntent,parsePriceCheckStop,parsePriceCheckTarget};//# sourceMappingURL=parsePriceCheckIntent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsePriceCheckIntent.js","sources":["../../../../src/features/shopping/services/parsePriceCheckIntent.ts"],"sourcesContent":["/**\n * Price-monitor intent — native twin of surface `parsePriceCheckIntent.ts`.\n * Hermes-safe boundaries (no lookbehind).\n */\nimport { normalizeShoppingQuery } from './parseShoppingIntent';\n\nexport interface PriceCheckChatIntent {\n query: string;\n targetPrice?: number;\n}\n\n/** Same idea as surface EDGE_L/EDGE_R without lookbehind (Hermes). */\nconst EDGE_L = '(^|[^A-Za-z0-9/_-])';\nconst EDGE_R = '(?![A-Za-z0-9/_-])';\n\nconst MONITOR_PATTERNS: readonly RegExp[] = [\n new RegExp(\n `${EDGE_L}(?:run|do|set\\\\s*up|start|schedule|create)?\\\\s*(?:an?\\\\s+)?(?:hourly\\\\s+)?price[- ]?check(?:s)?(?:\\\\s+(?:on|for|of))?${EDGE_R}`,\n 'i',\n ),\n new RegExp(\n `${EDGE_L}check(?:\\\\s+(?:on|up\\\\s+on))?\\\\s+(?:the\\\\s+|its\\\\s+|that\\\\s+)?price(?:s)?(?:\\\\s+(?:of|for|on))?${EDGE_R}`,\n 'i',\n ),\n new RegExp(\n `${EDGE_L}(?:watch|track|monitor|follow)\\\\s+(?:the\\\\s+|its\\\\s+)?price(?:s)?(?:\\\\s+(?:of|for|on))?${EDGE_R}`,\n 'i',\n ),\n new RegExp(\n `${EDGE_L}keep\\\\s+(?:an?\\\\s+eye\\\\s+on|watch(?:ing)?(?:\\\\s+(?:of|on))?|track(?:ing)?\\\\s+of)\\\\s+(?:the\\\\s+)?price(?:s)?(?:\\\\s+(?:of|for|on))?${EDGE_R}`,\n 'i',\n ),\n new RegExp(`${EDGE_L}(?:set(?:\\\\s*up)?\\\\s+)?(?:an?\\\\s+)?price\\\\s+alert(?:s)?(?:\\\\s+(?:on|for|of))?${EDGE_R}`, 'i'),\n new RegExp(\n `${EDGE_L}(?:alert|notify|tell|ping|let)\\\\s+(?:me|us)(?:\\\\s+know)?\\\\s+(?:when|if|once)\\\\s+(?:the\\\\s+)?(?:price(?:\\\\s+(?:of|for|on))?\\\\s*)?(?:it\\\\s+)?(?:drops?|falls?|goes\\\\s+(?:down|below|under)|dips?|is\\\\s+(?:lower|cheaper)|gets?\\\\s+cheaper|hits)?${EDGE_R}`,\n 'i',\n ),\n];\n\nconst TARGET_PATTERNS: readonly RegExp[] = [\n /\\b(?:drops?|falls?|goes|dips?|gets?)\\s+(?:down\\s+)?(?:below|under|to|past)\\s+\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n /\\b(?:below|under)\\s+\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n /\\bhits?\\s+\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n /\\btarget(?:\\s+price)?\\s*(?:of|is|:|at)?\\s*\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n /\\b(?:at|to)\\s+\\$\\s*(\\d+(?:\\.\\d+)?)/i,\n];\n\nconst CONDITION_TAILS: readonly RegExp[] = [\n /\\b(?:when|if|once)\\s+(?:it|the\\s+price|they)?\\s*(?:drops?|falls?|goes|dips?|gets?|hits?|is)\\b[^,.;]*/gi,\n /\\b(?:drops?|falls?|goes)\\s+(?:down\\s+)?(?:below|under|to|past)\\s+\\$?\\s*\\d+(?:\\.\\d+)?/gi,\n /\\b(?:below|under|to|at)\\s+\\$\\s*\\d+(?:\\.\\d+)?/gi,\n /\\btarget(?:\\s+price)?\\s*(?:of|is|:|at)?\\s*\\$?\\s*\\d+(?:\\.\\d+)?/gi,\n /\\b(?:every|each)\\s+(?:hour|day|hr)\\b/gi,\n /\\bhourly\\b/gi,\n];\n\nconst STOP_PATTERN = new RegExp(\n `${EDGE_L}(?:stop|pause|cancel|end|kill|turn\\\\s+off|disable|remove)${EDGE_R}[\\\\s\\\\S]{0,40}?` +\n `${EDGE_L}(?:price[- ]?check(?:s)?|price\\\\s+(?:watch(?:es)?|alert(?:s)?|monitor(?:ing)?)|` +\n `(?:watching|tracking|monitoring)\\\\s+(?:the\\\\s+)?price(?:s)?)${EDGE_R}`,\n 'i',\n);\n\nexport function parsePriceCheckTarget(text: string): number | undefined {\n for (const pattern of TARGET_PATTERNS) {\n const match = text.match(pattern);\n if (!match) continue;\n const value = Number.parseFloat(match[1]);\n if (Number.isFinite(value) && value > 0) return value;\n }\n return undefined;\n}\n\nexport function parsePriceCheckStop(text: string): boolean {\n return STOP_PATTERN.test((text || '').trim());\n}\n\nexport function parsePriceCheckIntent(text: string): PriceCheckChatIntent | null {\n const trimmed = (text || '').trim();\n if (trimmed.length < 4) return null;\n if (parsePriceCheckStop(trimmed)) return null;\n if (/^(?:what|whats|what's|how\\s+much|how\\s+many)\\b/i.test(trimmed)) return null;\n\n const matched = MONITOR_PATTERNS.find((pattern) => pattern.test(trimmed));\n if (!matched) return null;\n\n const targetPrice = parsePriceCheckTarget(trimmed);\n let remainder = trimmed;\n for (const pattern of MONITOR_PATTERNS) {\n remainder = remainder.replace(new RegExp(pattern.source, 'gi'), ' ');\n }\n for (const pattern of CONDITION_TAILS) {\n remainder = remainder.replace(pattern, ' ');\n }\n remainder = remainder\n .replace(/\\s{2,}/g, ' ')\n .trim()\n .replace(/[,;]?\\s*(?:and|or|then|also)\\s*$/i, '')\n .replace(/^(?:and|or|then|also)\\s+/i, '')\n .trim();\n\n const normalized = normalizeShoppingQuery(remainder);\n return {\n query: normalized?.query ?? '',\n ...(targetPrice !== undefined ? { targetPrice } : {}),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const LEAD_IN_PATTERNS = [/^(?:hi|hey|hello|yo|ok|okay|so|well|um+|hm+)\b[\s,.!-]*/i, /^(?:please|kindly|pls)\b[\s,]*/i, /^(?:can|could|would|will|do|does|did)\s+(?:you|u|we|i)\b\s*/i, /^i(?:'m|’m|\s+am)?\b\s*/i, /^(?:want(?:ing)?|need(?:ing)?|look(?:ing)?|try(?:ing)?)\b(?:\s+(?:to|for))?\s*/i, /^(?:help\s+me|do\s+you\s+have|have\s+you\s+got|are\s+there(?:\s+any)?)\b\s*/i, /^(?:find|search|shop|shopping|buy|order|browse|show|get|give|recommend|suggest|compare|list)\b(?:\s+(?:for|me|us|out|some|any))*\s*/i, /^(?:some|any|a|an|the|few|couple\s+of|pair\s+of|good|nice|great|really|just|only)\b\s*/i];
|
|
18
|
+
const TAIL_PATTERNS = [/[\s,]*(?:please|thanks|thank\s+you|thx|pls)\b[\s.!?]*$/i, /\s+for\s+(?:me|us)\b[\s.!?]*$/i, /[\s.!?,;:]+$/];
|
|
19
|
+
const BUDGET_PHRASES = [/\b(?:my\s+)?budget\s*(?:of|is|:)?\s*\$?\s*\d+(?:\.\d+)?/gi, /\b(?:under|below|less\s+than|no\s+more\s+than|cheaper\s+than|max(?:imum)?|up\s+to|within|around|about|near)\s+\$?\s*\d+(?:\.\d+)?(?:\s*(?:dollars|usd|bucks))?/gi, /\bfor\s+(?:under|less\s+than)\s+\$?\s*\d+(?:\.\d+)?/gi];
|
|
20
|
+
function parseBudget(text) {
|
|
21
|
+
const patterns = [/\b(?:under|below|less\s+than|no\s+more\s+than|cheaper\s+than|max(?:imum)?|up\s+to|within)\s+\$?\s*(\d+(?:\.\d+)?)/i, /\b(?:my\s+)?budget\s*(?:of|is|:)?\s+\$?\s*(\d+(?:\.\d+)?)/i];
|
|
22
|
+
for (const pattern of patterns) {
|
|
23
|
+
const match = text.match(pattern);
|
|
24
|
+
if (!match) continue;
|
|
25
|
+
const value = Number.parseFloat(match[1]);
|
|
26
|
+
if (Number.isFinite(value) && value > 0) return value;
|
|
27
|
+
}
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
function stripWrapper(text) {
|
|
31
|
+
let query = text;
|
|
32
|
+
for (let pass = 0; pass < LEAD_IN_PATTERNS.length * 2; pass++) {
|
|
33
|
+
let changed = false;
|
|
34
|
+
for (const pattern of LEAD_IN_PATTERNS) {
|
|
35
|
+
const next = query.replace(pattern, "").trim();
|
|
36
|
+
if (next && next !== query) {
|
|
37
|
+
query = next;
|
|
38
|
+
changed = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!changed) break;
|
|
42
|
+
}
|
|
43
|
+
for (const pattern of TAIL_PATTERNS) {
|
|
44
|
+
const next = query.replace(pattern, "").trim();
|
|
45
|
+
if (next) query = next;
|
|
46
|
+
}
|
|
47
|
+
return query;
|
|
48
|
+
}
|
|
49
|
+
function stripBudgetPhrases(text) {
|
|
50
|
+
let query = text;
|
|
51
|
+
for (const pattern of BUDGET_PHRASES) {
|
|
52
|
+
query = query.replace(pattern, " ");
|
|
53
|
+
}
|
|
54
|
+
return query.replace(/\s{2,}/g, " ").replace(/^[\s,]+|[\s,]+$/g, "");
|
|
55
|
+
}
|
|
56
|
+
function normalizeShoppingQuery(text) {
|
|
57
|
+
const trimmed = (text || "").trim();
|
|
58
|
+
if (trimmed.length < 2) return null;
|
|
59
|
+
const budget = parseBudget(trimmed);
|
|
60
|
+
const query = stripBudgetPhrases(stripWrapper(trimmed));
|
|
61
|
+
if (!query || !/[a-z0-9]/i.test(query)) return null;
|
|
62
|
+
return __spreadValues({
|
|
63
|
+
query
|
|
64
|
+
}, budget != null ? {
|
|
65
|
+
budget
|
|
66
|
+
} : {});
|
|
67
|
+
}export{normalizeShoppingQuery,parseBudget};//# sourceMappingURL=parseShoppingIntent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseShoppingIntent.js","sources":["../../../../src/features/shopping/services/parseShoppingIntent.ts"],"sourcesContent":["/**\n * Structural shopping intent — native twin of the web surface parser.\n * Grammar only: no product-noun catalogue.\n */\n\nexport interface ParsedShoppingIntent {\n query: string;\n departmentId?: string;\n budget?: number;\n}\n\nconst LEAD_IN_PATTERNS: readonly RegExp[] = [\n /^(?:hi|hey|hello|yo|ok|okay|so|well|um+|hm+)\\b[\\s,.!-]*/i,\n /^(?:please|kindly|pls)\\b[\\s,]*/i,\n /^(?:can|could|would|will|do|does|did)\\s+(?:you|u|we|i)\\b\\s*/i,\n /^i(?:'m|’m|\\s+am)?\\b\\s*/i,\n /^(?:want(?:ing)?|need(?:ing)?|look(?:ing)?|try(?:ing)?)\\b(?:\\s+(?:to|for))?\\s*/i,\n /^(?:help\\s+me|do\\s+you\\s+have|have\\s+you\\s+got|are\\s+there(?:\\s+any)?)\\b\\s*/i,\n /^(?:find|search|shop|shopping|buy|order|browse|show|get|give|recommend|suggest|compare|list)\\b(?:\\s+(?:for|me|us|out|some|any))*\\s*/i,\n /^(?:some|any|a|an|the|few|couple\\s+of|pair\\s+of|good|nice|great|really|just|only)\\b\\s*/i,\n];\n\nconst TAIL_PATTERNS: readonly RegExp[] = [\n /[\\s,]*(?:please|thanks|thank\\s+you|thx|pls)\\b[\\s.!?]*$/i,\n /\\s+for\\s+(?:me|us)\\b[\\s.!?]*$/i,\n /[\\s.!?,;:]+$/,\n];\n\nconst BUDGET_PHRASES: readonly RegExp[] = [\n /\\b(?:my\\s+)?budget\\s*(?:of|is|:)?\\s*\\$?\\s*\\d+(?:\\.\\d+)?/gi,\n /\\b(?:under|below|less\\s+than|no\\s+more\\s+than|cheaper\\s+than|max(?:imum)?|up\\s+to|within|around|about|near)\\s+\\$?\\s*\\d+(?:\\.\\d+)?(?:\\s*(?:dollars|usd|bucks))?/gi,\n /\\bfor\\s+(?:under|less\\s+than)\\s+\\$?\\s*\\d+(?:\\.\\d+)?/gi,\n];\n\nexport function parseBudget(text: string): number | undefined {\n const patterns = [\n /\\b(?:under|below|less\\s+than|no\\s+more\\s+than|cheaper\\s+than|max(?:imum)?|up\\s+to|within)\\s+\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n /\\b(?:my\\s+)?budget\\s*(?:of|is|:)?\\s+\\$?\\s*(\\d+(?:\\.\\d+)?)/i,\n ];\n for (const pattern of patterns) {\n const match = text.match(pattern);\n if (!match) continue;\n const value = Number.parseFloat(match[1]);\n if (Number.isFinite(value) && value > 0) return value;\n }\n return undefined;\n}\n\nfunction stripWrapper(text: string): string {\n let query = text;\n for (let pass = 0; pass < LEAD_IN_PATTERNS.length * 2; pass++) {\n let changed = false;\n for (const pattern of LEAD_IN_PATTERNS) {\n const next = query.replace(pattern, '').trim();\n if (next && next !== query) {\n query = next;\n changed = true;\n }\n }\n if (!changed) break;\n }\n for (const pattern of TAIL_PATTERNS) {\n const next = query.replace(pattern, '').trim();\n if (next) query = next;\n }\n return query;\n}\n\nfunction stripBudgetPhrases(text: string): string {\n let query = text;\n for (const pattern of BUDGET_PHRASES) {\n query = query.replace(pattern, ' ');\n }\n return query.replace(/\\s{2,}/g, ' ').replace(/^[\\s,]+|[\\s,]+$/g, '');\n}\n\nexport function normalizeShoppingQuery(text: string): ParsedShoppingIntent | null {\n const trimmed = (text || '').trim();\n if (trimmed.length < 2) return null;\n\n const budget = parseBudget(trimmed);\n const query = stripBudgetPhrases(stripWrapper(trimmed));\n if (!query || !/[a-z0-9]/i.test(query)) return null;\n\n return { query, ...(budget != null ? { budget } : {}) };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAM,gBAAA,GAAsC,CAAC,0DAA4D,EAAA,iCAAA,EAAmC,gEAAgE,0BAA4B,EAAA,iFAAA,EAAmF,8EAAgF,EAAA,sIAAA,EAAwI,yFAAyF,CAAA;AAC5mB,MAAM,aAAmC,GAAA,CAAC,yDAA2D,EAAA,gCAAA,EAAkC,cAAc,CAAA;AACrJ,MAAM,cAAoC,GAAA,CAAC,2DAA6D,EAAA,kKAAA,EAAoK,uDAAuD,CAAA;AAC5T,SAAS,YAAY,IAAkC,EAAA;AAC5D,EAAM,MAAA,QAAA,GAAW,CAAC,oHAAA,EAAsH,4DAA4D,CAAA;AACpM,EAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAO,EAAA;AACZ,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,UAAW,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA;AACxC,IAAA,IAAI,OAAO,QAAS,CAAA,KAAK,CAAK,IAAA,KAAA,GAAQ,GAAU,OAAA,KAAA;AAAA;AAElD,EAAO,OAAA,MAAA;AACT;AACA,SAAS,aAAa,IAAsB,EAAA;AAC1C,EAAA,IAAI,KAAQ,GAAA,IAAA;AACZ,EAAA,KAAA,IAAS,OAAO,CAAG,EAAA,IAAA,GAAO,gBAAiB,CAAA,MAAA,GAAS,GAAG,IAAQ,EAAA,EAAA;AAC7D,IAAA,IAAI,OAAU,GAAA,KAAA;AACd,IAAA,KAAA,MAAW,WAAW,gBAAkB,EAAA;AACtC,MAAA,MAAM,OAAO,KAAM,CAAA,OAAA,CAAQ,OAAS,EAAA,EAAE,EAAE,IAAK,EAAA;AAC7C,MAAI,IAAA,IAAA,IAAQ,SAAS,KAAO,EAAA;AAC1B,QAAQ,KAAA,GAAA,IAAA;AACR,QAAU,OAAA,GAAA,IAAA;AAAA;AACZ;AAEF,IAAA,IAAI,CAAC,OAAS,EAAA;AAAA;AAEhB,EAAA,KAAA,MAAW,WAAW,aAAe,EAAA;AACnC,IAAA,MAAM,OAAO,KAAM,CAAA,OAAA,CAAQ,OAAS,EAAA,EAAE,EAAE,IAAK,EAAA;AAC7C,IAAA,IAAI,MAAc,KAAA,GAAA,IAAA;AAAA;AAEpB,EAAO,OAAA,KAAA;AACT;AACA,SAAS,mBAAmB,IAAsB,EAAA;AAChD,EAAA,IAAI,KAAQ,GAAA,IAAA;AACZ,EAAA,KAAA,MAAW,WAAW,cAAgB,EAAA;AACpC,IAAQ,KAAA,GAAA,KAAA,CAAM,OAAQ,CAAA,OAAA,EAAS,GAAG,CAAA;AAAA;AAEpC,EAAA,OAAO,MAAM,OAAQ,CAAA,SAAA,EAAW,GAAG,CAAE,CAAA,OAAA,CAAQ,oBAAoB,EAAE,CAAA;AACrE;AACO,SAAS,uBAAuB,IAA2C,EAAA;AAChF,EAAM,MAAA,OAAA,GAAA,CAAW,IAAQ,IAAA,EAAA,EAAI,IAAK,EAAA;AAClC,EAAI,IAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,EAAU,OAAA,IAAA;AAC/B,EAAM,MAAA,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,MAAM,KAAQ,GAAA,kBAAA,CAAmB,YAAa,CAAA,OAAO,CAAC,CAAA;AACtD,EAAA,IAAI,CAAC,KAAS,IAAA,CAAC,YAAY,IAAK,CAAA,KAAK,GAAU,OAAA,IAAA;AAC/C,EAAO,OAAA,cAAA,CAAA;AAAA,IACL;AAAA,GAAA,EACI,UAAU,IAAO,GAAA;AAAA,IACnB;AAAA,MACE,EAAC,CAAA;AAET"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {isNonMerchantHost,detectRetailerSourceFromUrl,isRetailerProductUrl}from'./retailerUrl.js';function isGoogleShoppingProductUrl(parsed) {
|
|
2
|
+
return /(?:^|\.)google\.[a-z.]+$/i.test(parsed.hostname) && /^\/shopping\/product\/\d+/i.test(parsed.pathname);
|
|
3
|
+
}
|
|
4
|
+
function isPlausibleProductUrl(url) {
|
|
5
|
+
if (!url) return false;
|
|
6
|
+
let parsed;
|
|
7
|
+
try {
|
|
8
|
+
parsed = new URL(url);
|
|
9
|
+
} catch (e) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return false;
|
|
13
|
+
if (isGoogleShoppingProductUrl(parsed)) return true;
|
|
14
|
+
if (isNonMerchantHost(url)) return false;
|
|
15
|
+
const source = detectRetailerSourceFromUrl(url);
|
|
16
|
+
if (source && source !== "google") return isRetailerProductUrl(url, source);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function isSellable(product) {
|
|
20
|
+
if (product.inStock === false) return false;
|
|
21
|
+
return isPlausibleProductUrl(product.url);
|
|
22
|
+
}
|
|
23
|
+
function keepSellableProducts(products) {
|
|
24
|
+
return products.filter(isSellable);
|
|
25
|
+
}export{isPlausibleProductUrl,isSellable,keepSellableProducts};//# sourceMappingURL=productAvailability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productAvailability.js","sources":["../../../../src/features/shopping/services/productAvailability.ts"],"sourcesContent":["/**\n * Sellable-row gate — native twin of surface `productAvailability.ts`.\n * A chat card / AI summary only repeats rows the shopper can act on.\n */\nimport type { Product } from '../catalog';\nimport { detectRetailerSourceFromUrl, isNonMerchantHost, isRetailerProductUrl } from './retailerUrl';\n\nfunction isGoogleShoppingProductUrl(parsed: URL): boolean {\n return /(?:^|\\.)google\\.[a-z.]+$/i.test(parsed.hostname) && /^\\/shopping\\/product\\/\\d+/i.test(parsed.pathname);\n}\n\nexport function isPlausibleProductUrl(url: string | undefined): boolean {\n if (!url) return false;\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return false;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return false;\n if (isGoogleShoppingProductUrl(parsed)) return true;\n if (isNonMerchantHost(url)) return false;\n const source = detectRetailerSourceFromUrl(url);\n if (source && source !== 'google') return isRetailerProductUrl(url, source);\n return true;\n}\n\nexport function isSellable(product: Pick<Product, 'inStock' | 'url'>): boolean {\n if (product.inStock === false) return false;\n return isPlausibleProductUrl(product.url);\n}\n\nexport function keepSellableProducts<T extends Pick<Product, 'inStock' | 'url'>>(products: T[]): T[] {\n return products.filter(isSellable);\n}\n"],"names":[],"mappings":"kGAMA,SAAS,2BAA2B,MAAsB,EAAA;AACxD,EAAO,OAAA,2BAAA,CAA4B,KAAK,MAAO,CAAA,QAAQ,KAAK,4BAA6B,CAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC/G;AACO,SAAS,sBAAsB,GAAkC,EAAA;AACtE,EAAI,IAAA,CAAC,KAAY,OAAA,KAAA;AACjB,EAAI,IAAA,MAAA;AACJ,EAAI,IAAA;AACF,IAAS,MAAA,GAAA,IAAI,IAAI,GAAG,CAAA;AAAA,GACd,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,IAAI,OAAO,QAAa,KAAA,OAAA,IAAW,MAAO,CAAA,QAAA,KAAa,UAAiB,OAAA,KAAA;AACxE,EAAI,IAAA,0BAAA,CAA2B,MAAM,CAAA,EAAU,OAAA,IAAA;AAC/C,EAAI,IAAA,iBAAA,CAAkB,GAAG,CAAA,EAAU,OAAA,KAAA;AACnC,EAAM,MAAA,MAAA,GAAS,4BAA4B,GAAG,CAAA;AAC9C,EAAA,IAAI,UAAU,MAAW,KAAA,QAAA,EAAiB,OAAA,oBAAA,CAAqB,KAAK,MAAM,CAAA;AAC1E,EAAO,OAAA,IAAA;AACT;AACO,SAAS,WAAW,OAAoD,EAAA;AAC7E,EAAI,IAAA,OAAA,CAAQ,OAAY,KAAA,KAAA,EAAc,OAAA,KAAA;AACtC,EAAO,OAAA,qBAAA,CAAsB,QAAQ,GAAG,CAAA;AAC1C;AACO,SAAS,qBAAiE,QAAoB,EAAA;AACnG,EAAO,OAAA,QAAA,CAAS,OAAO,UAAU,CAAA;AACnC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const DEFAULT_PRODUCT_FILTERS = {
|
|
2
|
+
maxPrice: null,
|
|
3
|
+
minRating: null,
|
|
4
|
+
minDiscount: null,
|
|
5
|
+
inStockOnly: false,
|
|
6
|
+
sources: [],
|
|
7
|
+
sort: "relevance"
|
|
8
|
+
};
|
|
9
|
+
function hasActiveFilters(filters) {
|
|
10
|
+
return filters.maxPrice !== null || filters.minRating !== null || filters.minDiscount !== null || filters.inStockOnly || filters.sources.length > 0;
|
|
11
|
+
}
|
|
12
|
+
function activeFilterCount(filters) {
|
|
13
|
+
return (filters.maxPrice !== null ? 1 : 0) + (filters.minRating !== null ? 1 : 0) + (filters.minDiscount !== null ? 1 : 0) + (filters.inStockOnly ? 1 : 0) + filters.sources.length;
|
|
14
|
+
}
|
|
15
|
+
function effectiveDiscountPercent(product) {
|
|
16
|
+
if (!(product.price > 0)) return 0;
|
|
17
|
+
const original = product.originalPrice;
|
|
18
|
+
if (typeof original !== "number" || !(original > product.price)) return 0;
|
|
19
|
+
return Math.round((original - product.price) / original * 100);
|
|
20
|
+
}
|
|
21
|
+
function matches(product, filters) {
|
|
22
|
+
var _a;
|
|
23
|
+
if (filters.sources.length > 0) {
|
|
24
|
+
const source = (_a = product.source) != null ? _a : "yantra";
|
|
25
|
+
if (!filters.sources.includes(source)) return false;
|
|
26
|
+
}
|
|
27
|
+
if (filters.maxPrice !== null && !(product.price > 0 && product.price <= filters.maxPrice)) return false;
|
|
28
|
+
if (filters.minRating !== null && !(product.rating >= filters.minRating)) return false;
|
|
29
|
+
if (filters.minDiscount !== null && effectiveDiscountPercent(product) < filters.minDiscount) return false;
|
|
30
|
+
if (filters.inStockOnly && product.inStock === false) return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function compare(a, b, sort) {
|
|
34
|
+
switch (sort) {
|
|
35
|
+
case "price-asc":
|
|
36
|
+
return (a.price > 0 ? a.price : Infinity) - (b.price > 0 ? b.price : Infinity);
|
|
37
|
+
case "price-desc":
|
|
38
|
+
return (b.price > 0 ? b.price : -Infinity) - (a.price > 0 ? a.price : -Infinity);
|
|
39
|
+
case "rating":
|
|
40
|
+
return b.rating - a.rating || b.reviews - a.reviews;
|
|
41
|
+
case "discount":
|
|
42
|
+
return effectiveDiscountPercent(b) - effectiveDiscountPercent(a);
|
|
43
|
+
case "relevance":
|
|
44
|
+
default:
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function applyProductFilters(products, filters) {
|
|
49
|
+
const kept = products.filter((product) => matches(product, filters));
|
|
50
|
+
if (filters.sort === "relevance") return kept;
|
|
51
|
+
return [...kept].sort((a, b) => compare(a, b, filters.sort));
|
|
52
|
+
}
|
|
53
|
+
function productFacets(products) {
|
|
54
|
+
var _a;
|
|
55
|
+
const sources = [];
|
|
56
|
+
let maxPrice = 0;
|
|
57
|
+
let hasDiscounts = false;
|
|
58
|
+
let hasRatings = false;
|
|
59
|
+
for (const product of products) {
|
|
60
|
+
const source = (_a = product.source) != null ? _a : "yantra";
|
|
61
|
+
if (!sources.includes(source)) sources.push(source);
|
|
62
|
+
if (product.price > maxPrice) maxPrice = product.price;
|
|
63
|
+
if (effectiveDiscountPercent(product) > 0) hasDiscounts = true;
|
|
64
|
+
if (product.rating > 0) hasRatings = true;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
sources,
|
|
68
|
+
maxPrice,
|
|
69
|
+
hasDiscounts,
|
|
70
|
+
hasRatings
|
|
71
|
+
};
|
|
72
|
+
}export{DEFAULT_PRODUCT_FILTERS,activeFilterCount,applyProductFilters,effectiveDiscountPercent,hasActiveFilters,productFacets};//# sourceMappingURL=productFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productFilters.js","sources":["../../../../src/features/shopping/services/productFilters.ts"],"sourcesContent":["/**\n * The filter model shared by the landing page's trending rails and the search\n * results grid.\n *\n * Pure functions over `Product[]` — no fetching. Every lane (catalog, the\n * retailer SERPs, the paired browser) returns the same {@link Product}, so one\n * filter pass serves all of them, and the same chips mean the same thing\n * whether the user is browsing trending rows or reading search results.\n *\n * Two rules exist because a shopping row is routinely PARTIAL, and \"the field\n * is missing\" must never be read as \"the field is false\":\n *\n * - `inStockOnly` drops only rows that say `inStock === false`. Only the typed\n * catalog knows stock; a SERP scrape leaves it undefined, so treating\n * undefined as out-of-stock would empty the grid on every non-catalog lane.\n * - `maxPrice` DOES drop rows with no usable price (a row that only says \"see\n * price on Amazon\"). A ceiling is a claim about what the shopper will pay,\n * and a row we cannot price cannot be claimed to satisfy it.\n */\n\nimport type { Product, ProductSource } from '../catalog';\n\nexport type ProductSortOrder = 'relevance' | 'price-asc' | 'price-desc' | 'rating' | 'discount';\n\nexport interface ProductFilters {\n /** Price ceiling in the row's own currency units. `null` = no ceiling. */\n maxPrice: number | null;\n /** Minimum star rating, 0–5. `null` = unrated rows welcome. */\n minRating: number | null;\n /** Minimum discount percent off list price. `null` = full-price rows welcome. */\n minDiscount: number | null;\n /** Hide rows the catalog reports as out of stock. */\n inStockOnly: boolean;\n /** Retailer lanes to keep. Empty = every lane. */\n sources: ProductSource[];\n sort: ProductSortOrder;\n}\n\nexport const DEFAULT_PRODUCT_FILTERS: ProductFilters = {\n maxPrice: null,\n minRating: null,\n minDiscount: null,\n inStockOnly: false,\n sources: [],\n sort: 'relevance',\n};\n\n/** Is anything actually narrowing the rows? (Sort alone is not a filter.) */\nexport function hasActiveFilters(filters: ProductFilters): boolean {\n return (\n filters.maxPrice !== null ||\n filters.minRating !== null ||\n filters.minDiscount !== null ||\n filters.inStockOnly ||\n filters.sources.length > 0\n );\n}\n\n/** How many chips are narrowing — the count on the \"Filters\" button. */\nexport function activeFilterCount(filters: ProductFilters): number {\n return (\n (filters.maxPrice !== null ? 1 : 0) +\n (filters.minRating !== null ? 1 : 0) +\n (filters.minDiscount !== null ? 1 : 0) +\n (filters.inStockOnly ? 1 : 0) +\n filters.sources.length\n );\n}\n\n/**\n * The discount a card can honestly claim: a percent is only real when there is\n * a list price ABOVE the current one to discount from. Mirrors the same\n * reconciliation ProductRow does before it paints a badge, so the chip can\n * never select rows whose card shows no discount.\n */\nexport function effectiveDiscountPercent(product: Product): number {\n if (!(product.price > 0)) return 0;\n const original = product.originalPrice;\n if (typeof original !== 'number' || !(original > product.price)) return 0;\n return Math.round(((original - product.price) / original) * 100);\n}\n\nfunction matches(product: Product, filters: ProductFilters): boolean {\n if (filters.sources.length > 0) {\n const source = product.source ?? 'yantra';\n if (!filters.sources.includes(source)) return false;\n }\n // Unpriced rows cannot satisfy a ceiling — see the module note.\n if (filters.maxPrice !== null && !(product.price > 0 && product.price <= filters.maxPrice)) return false;\n if (filters.minRating !== null && !(product.rating >= filters.minRating)) return false;\n if (filters.minDiscount !== null && effectiveDiscountPercent(product) < filters.minDiscount) return false;\n // Explicit `false` only — undefined means \"this lane does not report stock\".\n if (filters.inStockOnly && product.inStock === false) return false;\n return true;\n}\n\n/**\n * Sort comparator. `relevance` keeps the incoming order, which is already\n * meaningful: the search lanes merge sources in a deliberate order (typed\n * catalog rows first), and re-sorting by a scraped field would discard that.\n */\nfunction compare(a: Product, b: Product, sort: ProductSortOrder): number {\n switch (sort) {\n case 'price-asc':\n // Unpriced rows sink rather than sorting as free.\n return (a.price > 0 ? a.price : Infinity) - (b.price > 0 ? b.price : Infinity);\n case 'price-desc':\n return (b.price > 0 ? b.price : -Infinity) - (a.price > 0 ? a.price : -Infinity);\n case 'rating':\n // Ties broken by review count: 5.0 from two reviewers is not 4.7 from ten thousand.\n return b.rating - a.rating || b.reviews - a.reviews;\n case 'discount':\n return effectiveDiscountPercent(b) - effectiveDiscountPercent(a);\n case 'relevance':\n default:\n return 0;\n }\n}\n\nexport function applyProductFilters(products: Product[], filters: ProductFilters): Product[] {\n const kept = products.filter((product) => matches(product, filters));\n if (filters.sort === 'relevance') return kept;\n // Copy first: the caller's array is state elsewhere, and `sort` mutates.\n return [...kept].sort((a, b) => compare(a, b, filters.sort));\n}\n\nexport interface ProductFacets {\n /** Lanes actually present in these rows, in the order the rows arrived. */\n sources: ProductSource[];\n /** Highest priced row, so a price slider can bound itself to real data. */\n maxPrice: number;\n /** True when at least one row carries a real discount worth offering a chip for. */\n hasDiscounts: boolean;\n /** True when at least one row is rated, so the rating chips are not dead controls. */\n hasRatings: boolean;\n}\n\n/**\n * What the rows on screen can actually be filtered BY.\n *\n * Chips are built from this rather than from the full source list, so the bar\n * never offers \"Costco\" to a result set with no Costco rows — selecting it\n * would blank the grid and read as a broken filter.\n */\nexport function productFacets(products: Product[]): ProductFacets {\n const sources: ProductSource[] = [];\n let maxPrice = 0;\n let hasDiscounts = false;\n let hasRatings = false;\n for (const product of products) {\n const source = product.source ?? 'yantra';\n if (!sources.includes(source)) sources.push(source);\n if (product.price > maxPrice) maxPrice = product.price;\n if (effectiveDiscountPercent(product) > 0) hasDiscounts = true;\n if (product.rating > 0) hasRatings = true;\n }\n return { sources, maxPrice, hasDiscounts, hasRatings };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const HOST_SOURCE = [{
|
|
2
|
+
re: /amazon\./i,
|
|
3
|
+
source: "amazon"
|
|
4
|
+
}, {
|
|
5
|
+
re: /walmart\./i,
|
|
6
|
+
source: "walmart"
|
|
7
|
+
}, {
|
|
8
|
+
re: /bestbuy\./i,
|
|
9
|
+
source: "bestbuy"
|
|
10
|
+
}, {
|
|
11
|
+
re: /ebay\./i,
|
|
12
|
+
source: "ebay"
|
|
13
|
+
}, {
|
|
14
|
+
re: /target\./i,
|
|
15
|
+
source: "target"
|
|
16
|
+
}, {
|
|
17
|
+
re: /costco\./i,
|
|
18
|
+
source: "costco"
|
|
19
|
+
}, {
|
|
20
|
+
re: /homedepot\./i,
|
|
21
|
+
source: "homedepot"
|
|
22
|
+
}, {
|
|
23
|
+
re: /lowes\./i,
|
|
24
|
+
source: "lowes"
|
|
25
|
+
}, {
|
|
26
|
+
re: /newegg\./i,
|
|
27
|
+
source: "newegg"
|
|
28
|
+
}, {
|
|
29
|
+
re: /myshopify\.com/i,
|
|
30
|
+
source: "shopify"
|
|
31
|
+
}];
|
|
32
|
+
const PRODUCT_URL_PATTERNS = {
|
|
33
|
+
amazon: /\/(?:dp|gp\/product|gp\/aw\/d|product)\/([A-Z0-9]{10})(?:[/?#]|$)/i,
|
|
34
|
+
walmart: /\/ip\/[^?#]*\d/i,
|
|
35
|
+
bestbuy: /\/site\/[^?#]*\d\.p(?:[/?#]|$)/i,
|
|
36
|
+
ebay: /\/itm\/\d+/i,
|
|
37
|
+
target: /\/-\/A-\w+/i,
|
|
38
|
+
costco: /\.product\.\d+\.html/i,
|
|
39
|
+
homedepot: /\/p\/[^?#]*\d/i,
|
|
40
|
+
lowes: /\/pd\/[^?#]*\d/i,
|
|
41
|
+
newegg: /\/p\/[A-Za-z0-9]+/i,
|
|
42
|
+
shopify: /\/products\/[a-z0-9][a-z0-9-]*/i
|
|
43
|
+
};
|
|
44
|
+
const AGGREGATOR_SOURCES = /* @__PURE__ */ new Set(["google"]);
|
|
45
|
+
const GENERIC_PRODUCT_PATH = /\/(?:dp|gp\/product)\/[A-Z0-9]{10}(?:[/?#]|$)|\/ip\/[^?#]*\d|\/itm\/\d{9,}|\/-\/A-\w+|\/site\/[^?#]*\d\.p(?:[/?#]|$)|\/products?\/[a-z0-9][a-z0-9-]{2,}|\/pd?\/[^?#]*\d|\.product\.\d+\.html/i;
|
|
46
|
+
const NON_MERCHANT_HOST = /(?:^|\/\/|\.)(?:google|googleusercontent|gstatic|bing|duckduckgo|yahoo|youtube|facebook|instagram|pinterest|reddit|quora|wikipedia|medium|blogspot|substack|tiktok|twitter)\./i;
|
|
47
|
+
function isNonMerchantHost(url) {
|
|
48
|
+
return !!url && NON_MERCHANT_HOST.test(url);
|
|
49
|
+
}
|
|
50
|
+
function detectRetailerSourceFromUrl(url) {
|
|
51
|
+
if (!url) return void 0;
|
|
52
|
+
for (const {
|
|
53
|
+
re,
|
|
54
|
+
source
|
|
55
|
+
} of HOST_SOURCE) {
|
|
56
|
+
if (re.test(url)) return source;
|
|
57
|
+
}
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
60
|
+
function isAggregatorProductUrl(url) {
|
|
61
|
+
if (!url) return false;
|
|
62
|
+
if (NON_MERCHANT_HOST.test(url)) return false;
|
|
63
|
+
const source = detectRetailerSourceFromUrl(url);
|
|
64
|
+
if (source) return isRetailerProductUrl(url, source);
|
|
65
|
+
return GENERIC_PRODUCT_PATH.test(url);
|
|
66
|
+
}
|
|
67
|
+
function isRetailerProductUrl(url, source) {
|
|
68
|
+
if (!url) return false;
|
|
69
|
+
if (AGGREGATOR_SOURCES.has(source)) return isAggregatorProductUrl(url);
|
|
70
|
+
const host = detectRetailerSourceFromUrl(url);
|
|
71
|
+
if (host && host !== source) return false;
|
|
72
|
+
const pattern = PRODUCT_URL_PATTERNS[source];
|
|
73
|
+
if (!pattern) return false;
|
|
74
|
+
return pattern.test(url);
|
|
75
|
+
}export{detectRetailerSourceFromUrl,isAggregatorProductUrl,isNonMerchantHost,isRetailerProductUrl};//# sourceMappingURL=retailerUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retailerUrl.js","sources":["../../../../src/features/shopping/services/retailerUrl.ts"],"sourcesContent":["/**\n * Retailer URL classification — native twin of `@yantra/shopping-surface`\n * `services/retailerUrl.ts`. Hermes-safe (no lookbehind).\n */\nimport type { ProductSource } from '../catalog';\n\nconst HOST_SOURCE: Array<{ re: RegExp; source: ProductSource }> = [\n { re: /amazon\\./i, source: 'amazon' },\n { re: /walmart\\./i, source: 'walmart' },\n { re: /bestbuy\\./i, source: 'bestbuy' },\n { re: /ebay\\./i, source: 'ebay' },\n { re: /target\\./i, source: 'target' },\n { re: /costco\\./i, source: 'costco' },\n { re: /homedepot\\./i, source: 'homedepot' },\n { re: /lowes\\./i, source: 'lowes' },\n { re: /newegg\\./i, source: 'newegg' },\n { re: /myshopify\\.com/i, source: 'shopify' },\n];\n\nconst PRODUCT_URL_PATTERNS: Partial<Record<ProductSource, RegExp>> = {\n amazon: /\\/(?:dp|gp\\/product|gp\\/aw\\/d|product)\\/([A-Z0-9]{10})(?:[/?#]|$)/i,\n walmart: /\\/ip\\/[^?#]*\\d/i,\n bestbuy: /\\/site\\/[^?#]*\\d\\.p(?:[/?#]|$)/i,\n ebay: /\\/itm\\/\\d+/i,\n target: /\\/-\\/A-\\w+/i,\n costco: /\\.product\\.\\d+\\.html/i,\n homedepot: /\\/p\\/[^?#]*\\d/i,\n lowes: /\\/pd\\/[^?#]*\\d/i,\n newegg: /\\/p\\/[A-Za-z0-9]+/i,\n shopify: /\\/products\\/[a-z0-9][a-z0-9-]*/i,\n};\n\nconst AGGREGATOR_SOURCES = new Set<ProductSource>(['google']);\n\nconst GENERIC_PRODUCT_PATH =\n /\\/(?:dp|gp\\/product)\\/[A-Z0-9]{10}(?:[/?#]|$)|\\/ip\\/[^?#]*\\d|\\/itm\\/\\d{9,}|\\/-\\/A-\\w+|\\/site\\/[^?#]*\\d\\.p(?:[/?#]|$)|\\/products?\\/[a-z0-9][a-z0-9-]{2,}|\\/pd?\\/[^?#]*\\d|\\.product\\.\\d+\\.html/i;\n\nconst NON_MERCHANT_HOST =\n /(?:^|\\/\\/|\\.)(?:google|googleusercontent|gstatic|bing|duckduckgo|yahoo|youtube|facebook|instagram|pinterest|reddit|quora|wikipedia|medium|blogspot|substack|tiktok|twitter)\\./i;\n\nexport function isNonMerchantHost(url?: string): boolean {\n return !!url && NON_MERCHANT_HOST.test(url);\n}\n\nexport function detectRetailerSourceFromUrl(url?: string): ProductSource | undefined {\n if (!url) return undefined;\n for (const { re, source } of HOST_SOURCE) {\n if (re.test(url)) return source;\n }\n return undefined;\n}\n\nexport function isAggregatorProductUrl(url?: string): boolean {\n if (!url) return false;\n if (NON_MERCHANT_HOST.test(url)) return false;\n const source = detectRetailerSourceFromUrl(url);\n if (source) return isRetailerProductUrl(url, source);\n return GENERIC_PRODUCT_PATH.test(url);\n}\n\nexport function isRetailerProductUrl(url: string | undefined, source: ProductSource): boolean {\n if (!url) return false;\n if (AGGREGATOR_SOURCES.has(source)) return isAggregatorProductUrl(url);\n const host = detectRetailerSourceFromUrl(url);\n if (host && host !== source) return false;\n const pattern = PRODUCT_URL_PATTERNS[source];\n if (!pattern) return false;\n return pattern.test(url);\n}\n\nexport function isKnownRetailerProductUrl(url?: string): boolean {\n const source = detectRetailerSourceFromUrl(url);\n return !!source && isRetailerProductUrl(url, source);\n}\n"],"names":[],"mappings":"AAKA,MAAM,cAGD,CAAC;AAAA,EACJ,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,YAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,YAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,cAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,UAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA;AACV,CAAC,CAAA;AACD,MAAM,oBAA+D,GAAA;AAAA,EACnE,MAAQ,EAAA,oEAAA;AAAA,EACR,OAAS,EAAA,iBAAA;AAAA,EACT,OAAS,EAAA,iCAAA;AAAA,EACT,IAAM,EAAA,aAAA;AAAA,EACN,MAAQ,EAAA,aAAA;AAAA,EACR,MAAQ,EAAA,uBAAA;AAAA,EACR,SAAW,EAAA,gBAAA;AAAA,EACX,KAAO,EAAA,iBAAA;AAAA,EACP,MAAQ,EAAA,oBAAA;AAAA,EACR,OAAS,EAAA;AACX,CAAA;AACA,MAAM,kBAAqB,mBAAA,IAAI,GAAmB,CAAA,CAAC,QAAQ,CAAC,CAAA;AAC5D,MAAM,oBAAuB,GAAA,+LAAA;AAC7B,MAAM,iBAAoB,GAAA,gLAAA;AACnB,SAAS,kBAAkB,GAAuB,EAAA;AACvD,EAAA,OAAO,CAAC,CAAC,GAAO,IAAA,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAC5C;AACO,SAAS,4BAA4B,GAAyC,EAAA;AACnF,EAAI,IAAA,CAAC,KAAY,OAAA,MAAA;AACjB,EAAW,KAAA,MAAA;AAAA,IACT,EAAA;AAAA,IACA;AAAA,OACG,WAAa,EAAA;AAChB,IAAA,IAAI,EAAG,CAAA,IAAA,CAAK,GAAG,CAAA,EAAU,OAAA,MAAA;AAAA;AAE3B,EAAO,OAAA,MAAA;AACT;AACO,SAAS,uBAAuB,GAAuB,EAAA;AAC5D,EAAI,IAAA,CAAC,KAAY,OAAA,KAAA;AACjB,EAAA,IAAI,iBAAkB,CAAA,IAAA,CAAK,GAAG,CAAA,EAAU,OAAA,KAAA;AACxC,EAAM,MAAA,MAAA,GAAS,4BAA4B,GAAG,CAAA;AAC9C,EAAA,IAAI,MAAQ,EAAA,OAAO,oBAAqB,CAAA,GAAA,EAAK,MAAM,CAAA;AACnD,EAAO,OAAA,oBAAA,CAAqB,KAAK,GAAG,CAAA;AACtC;AACgB,SAAA,oBAAA,CAAqB,KAAyB,MAAgC,EAAA;AAC5F,EAAI,IAAA,CAAC,KAAY,OAAA,KAAA;AACjB,EAAA,IAAI,mBAAmB,GAAI,CAAA,MAAM,CAAG,EAAA,OAAO,uBAAuB,GAAG,CAAA;AACrE,EAAM,MAAA,IAAA,GAAO,4BAA4B,GAAG,CAAA;AAC5C,EAAI,IAAA,IAAA,IAAQ,IAAS,KAAA,MAAA,EAAe,OAAA,KAAA;AACpC,EAAM,MAAA,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAC3C,EAAI,IAAA,CAAC,SAAgB,OAAA,KAAA;AACrB,EAAO,OAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {brainCompleteViaBrain}from'../../../services/brainQuickReply.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const SHOPPING_AGENT_SYSTEM_PROMPT = "You are the Yantra shopping agent. You search and compare real products across Amazon, Walmart, eBay, Target, Shopify and Google Shopping, track prices over time, and manage a cart, watchlist and order history. This particular message is NOT a product search \u2014 it is conversation (a greeting, small talk, a question about you or about shopping in general). Answer it directly, warmly and briefly, the way a knowledgeable shop assistant would. Two or three sentences at most, plain text, no markdown headings and no bullet lists. Do not invent products, prices, stores or stock \u2014 you have not searched anything for this message. When it fits naturally, close by inviting them to name what they are looking for; never repeat that invitation twice in one reply, and never announce that you have classified their message.";
|
|
18
|
+
const SHOPPING_AGENT_FALLBACK = "I am your shopping agent \u2014 tell me what you are after and I will search Amazon, Walmart, eBay, Target and more, compare prices and keep watching them for you.";
|
|
19
|
+
const REPLY_MAX_TOKENS = 220;
|
|
20
|
+
const REPLY_TIMEOUT_MS = 12e3;
|
|
21
|
+
async function replyToNonShoppingTurn(text, history = [], opts = {}) {
|
|
22
|
+
const trimmed = (text || "").trim();
|
|
23
|
+
if (!trimmed) return null;
|
|
24
|
+
const messages = [{
|
|
25
|
+
role: "system",
|
|
26
|
+
content: SHOPPING_AGENT_SYSTEM_PROMPT
|
|
27
|
+
}, ...history.slice(-6).filter((turn) => turn.content.trim()).map((turn) => ({
|
|
28
|
+
role: turn.role,
|
|
29
|
+
content: turn.content
|
|
30
|
+
})), {
|
|
31
|
+
role: "user",
|
|
32
|
+
content: trimmed
|
|
33
|
+
}];
|
|
34
|
+
try {
|
|
35
|
+
const reply = await brainCompleteViaBrain(messages, __spreadValues({
|
|
36
|
+
maxTokens: REPLY_MAX_TOKENS,
|
|
37
|
+
timeoutMs: REPLY_TIMEOUT_MS
|
|
38
|
+
}, opts.signal ? {
|
|
39
|
+
signal: opts.signal
|
|
40
|
+
} : {}));
|
|
41
|
+
const answer = reply == null ? void 0 : reply.trim();
|
|
42
|
+
return answer ? answer : null;
|
|
43
|
+
} catch (e) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}export{SHOPPING_AGENT_FALLBACK,replyToNonShoppingTurn};//# sourceMappingURL=shoppingChatReply.js.map
|