@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,214 @@
|
|
|
1
|
+
import {resultUrl}from'./mediaActions.js';import {colorFromSolidSrc,solidColorPngDataUrl}from'./solidColorPng.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 VIDEO = "yantra-video-editing";
|
|
18
|
+
const FILTER_GRADE = {
|
|
19
|
+
none: null,
|
|
20
|
+
cinematic: {
|
|
21
|
+
contrast: 1.12,
|
|
22
|
+
saturation: 0.92,
|
|
23
|
+
brightness: -0.04
|
|
24
|
+
},
|
|
25
|
+
film: {
|
|
26
|
+
saturation: 0.85,
|
|
27
|
+
gamma: 1.05,
|
|
28
|
+
brightness: 0.03
|
|
29
|
+
},
|
|
30
|
+
kodak: {
|
|
31
|
+
saturation: 1.15,
|
|
32
|
+
gamma: 0.95,
|
|
33
|
+
hue: 8
|
|
34
|
+
},
|
|
35
|
+
mono: {
|
|
36
|
+
saturation: 0,
|
|
37
|
+
contrast: 1.08
|
|
38
|
+
},
|
|
39
|
+
vivid: {
|
|
40
|
+
contrast: 1.15,
|
|
41
|
+
saturation: 1.35
|
|
42
|
+
},
|
|
43
|
+
warm: {
|
|
44
|
+
hue: -12,
|
|
45
|
+
saturation: 1.08,
|
|
46
|
+
brightness: 0.03
|
|
47
|
+
},
|
|
48
|
+
cool: {
|
|
49
|
+
hue: 12,
|
|
50
|
+
saturation: 0.95
|
|
51
|
+
},
|
|
52
|
+
dreamy: {
|
|
53
|
+
blur: 4,
|
|
54
|
+
brightness: 0.06,
|
|
55
|
+
saturation: 1.1
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
function needsUpload(url) {
|
|
59
|
+
return /^(file|ph|assets-library|content|data):/i.test(url);
|
|
60
|
+
}
|
|
61
|
+
function imageSrcForExport(clip) {
|
|
62
|
+
const fill = clip.fillColor || colorFromSolidSrc(clip.src);
|
|
63
|
+
if (fill) return solidColorPngDataUrl(fill);
|
|
64
|
+
return clip.src;
|
|
65
|
+
}
|
|
66
|
+
async function renderExportSpec(spec, runAction, uploadMedia, onProgress) {
|
|
67
|
+
var _a, _b, _c, _d, _e;
|
|
68
|
+
const run = async (action, params, label) => resultUrl(await runAction(VIDEO, action, params), label);
|
|
69
|
+
const clipUrls = [];
|
|
70
|
+
for (let i = 0; i < spec.clips.length; i += 1) {
|
|
71
|
+
const clip = spec.clips[i];
|
|
72
|
+
const label = `clip ${i + 1}/${spec.clips.length}`;
|
|
73
|
+
let url = clip.type === "image" ? imageSrcForExport(clip) : clip.src;
|
|
74
|
+
if (needsUpload(url)) {
|
|
75
|
+
if (!uploadMedia) throw new Error(`${label} is on this phone and no uploader is available`);
|
|
76
|
+
onProgress == null ? void 0 : onProgress({
|
|
77
|
+
stage: `Uploading ${label}`
|
|
78
|
+
});
|
|
79
|
+
url = await uploadMedia(url);
|
|
80
|
+
}
|
|
81
|
+
if (clip.type === "image") {
|
|
82
|
+
onProgress == null ? void 0 : onProgress({
|
|
83
|
+
stage: `Rendering still ${label}`
|
|
84
|
+
});
|
|
85
|
+
const sec = ((_a = clip.durationSec) != null ? _a : 3) / clip.speed;
|
|
86
|
+
if (clip.kenBurns) {
|
|
87
|
+
url = await run("YANTRA_VIDEO_EDIT_KEN_BURNS", {
|
|
88
|
+
input_url: url,
|
|
89
|
+
duration_ms: Math.round(sec * 1e3),
|
|
90
|
+
fps: spec.fps,
|
|
91
|
+
zoom_start: clip.kenBurns.zoomStart,
|
|
92
|
+
zoom_end: clip.kenBurns.zoomEnd,
|
|
93
|
+
direction: clip.kenBurns.direction
|
|
94
|
+
}, "KEN_BURNS");
|
|
95
|
+
} else {
|
|
96
|
+
url = await run("YANTRA_VIDEO_EDIT_SLIDESHOW", {
|
|
97
|
+
input_url: url,
|
|
98
|
+
duration_per_image: sec,
|
|
99
|
+
fps: spec.fps
|
|
100
|
+
}, "SLIDESHOW");
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
let end = clip.trimEndSec;
|
|
104
|
+
if (clip.trimStartSec > 0 && end === null) {
|
|
105
|
+
onProgress == null ? void 0 : onProgress({
|
|
106
|
+
stage: `Measuring ${label}`
|
|
107
|
+
});
|
|
108
|
+
const probe = await runAction(VIDEO, "YANTRA_VIDEO_EDIT_PROBE", {
|
|
109
|
+
input_url: url
|
|
110
|
+
});
|
|
111
|
+
const duration = Number((_d = (_b = probe.duration_secs) != null ? _b : probe.duration) != null ? _d : (_c = probe.format) == null ? void 0 : _c.duration);
|
|
112
|
+
if (Number.isFinite(duration) && duration > 0) end = duration;
|
|
113
|
+
}
|
|
114
|
+
if (end !== null && (clip.trimStartSec > 0 || end > 0)) {
|
|
115
|
+
onProgress == null ? void 0 : onProgress({
|
|
116
|
+
stage: `Trimming ${label}`
|
|
117
|
+
});
|
|
118
|
+
url = await run("YANTRA_VIDEO_EDIT_TRIM", {
|
|
119
|
+
input_url: url,
|
|
120
|
+
start_secs: clip.trimStartSec,
|
|
121
|
+
end_secs: end
|
|
122
|
+
}, "TRIM");
|
|
123
|
+
}
|
|
124
|
+
if (clip.speed !== 1) {
|
|
125
|
+
onProgress == null ? void 0 : onProgress({
|
|
126
|
+
stage: `Speed ${clip.speed}x ${label}`
|
|
127
|
+
});
|
|
128
|
+
url = await run("YANTRA_VIDEO_EDIT_SPEED", {
|
|
129
|
+
input_url: url,
|
|
130
|
+
factor: clip.speed
|
|
131
|
+
}, "SPEED");
|
|
132
|
+
}
|
|
133
|
+
if (clip.muted) {
|
|
134
|
+
onProgress == null ? void 0 : onProgress({
|
|
135
|
+
stage: `Muting ${label}`
|
|
136
|
+
});
|
|
137
|
+
url = await run("YANTRA_VIDEO_EDIT_MUTE", {
|
|
138
|
+
input_url: url
|
|
139
|
+
}, "MUTE");
|
|
140
|
+
} else if (clip.volume < 0.99) {
|
|
141
|
+
onProgress == null ? void 0 : onProgress({
|
|
142
|
+
stage: `Volume ${label}`
|
|
143
|
+
});
|
|
144
|
+
url = await run("YANTRA_VIDEO_EDIT_VOLUME", {
|
|
145
|
+
input_url: url,
|
|
146
|
+
level: clip.volume
|
|
147
|
+
}, "VOLUME");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const grade = (_e = FILTER_GRADE[clip.filter]) != null ? _e : null;
|
|
151
|
+
if (grade) {
|
|
152
|
+
onProgress == null ? void 0 : onProgress({
|
|
153
|
+
stage: `Grading ${label}`
|
|
154
|
+
});
|
|
155
|
+
url = await run("YANTRA_VIDEO_EDIT_COLOR_ADJUST", __spreadValues({
|
|
156
|
+
input_url: url
|
|
157
|
+
}, grade), "COLOR_ADJUST");
|
|
158
|
+
}
|
|
159
|
+
clipUrls.push(url);
|
|
160
|
+
}
|
|
161
|
+
if (clipUrls.length === 0) throw new Error("Nothing to render");
|
|
162
|
+
let finalUrl = clipUrls[0];
|
|
163
|
+
if (clipUrls.length > 1) {
|
|
164
|
+
onProgress == null ? void 0 : onProgress({
|
|
165
|
+
stage: `Joining ${clipUrls.length} clips`
|
|
166
|
+
});
|
|
167
|
+
finalUrl = await run("YANTRA_VIDEO_EDIT_CONCAT", {
|
|
168
|
+
input_url: clipUrls[0],
|
|
169
|
+
input_urls: clipUrls.slice(1),
|
|
170
|
+
reencode: true
|
|
171
|
+
}, "CONCAT");
|
|
172
|
+
}
|
|
173
|
+
if (spec.soundtrack) {
|
|
174
|
+
onProgress == null ? void 0 : onProgress({
|
|
175
|
+
stage: "Adding soundtrack"
|
|
176
|
+
});
|
|
177
|
+
finalUrl = await run("YANTRA_VIDEO_EDIT_ADD_AUDIO", {
|
|
178
|
+
input_url: finalUrl,
|
|
179
|
+
audio_input_url: spec.soundtrack.audioUrl,
|
|
180
|
+
replace_existing: spec.soundtrack.mode === "replace"
|
|
181
|
+
}, "ADD_AUDIO");
|
|
182
|
+
}
|
|
183
|
+
if (spec.voiceover) {
|
|
184
|
+
onProgress == null ? void 0 : onProgress({
|
|
185
|
+
stage: "Adding voiceover"
|
|
186
|
+
});
|
|
187
|
+
finalUrl = await run("YANTRA_VIDEO_EDIT_ADD_AUDIO", {
|
|
188
|
+
input_url: finalUrl,
|
|
189
|
+
audio_input_url: spec.voiceover.audioUrl,
|
|
190
|
+
// A replace-mode voiceover must not erase the soundtrack that
|
|
191
|
+
// was muxed one step earlier - narration mixes over it.
|
|
192
|
+
replace_existing: spec.voiceover.mode === "replace" && !spec.soundtrack
|
|
193
|
+
}, "ADD_AUDIO");
|
|
194
|
+
}
|
|
195
|
+
for (let i = 0; i < spec.texts.length; i += 1) {
|
|
196
|
+
const t = spec.texts[i];
|
|
197
|
+
onProgress == null ? void 0 : onProgress({
|
|
198
|
+
stage: `Title ${i + 1}/${spec.texts.length}`
|
|
199
|
+
});
|
|
200
|
+
finalUrl = await run("YANTRA_VIDEO_EDIT_OVERLAY_TEXT", {
|
|
201
|
+
input_url: finalUrl,
|
|
202
|
+
text: t.text,
|
|
203
|
+
// Normalized editor position -> ffmpeg expressions over the
|
|
204
|
+
// actual frame size, anchored at the text centre.
|
|
205
|
+
x: `(w-text_w)*${t.x.toFixed(3)}`,
|
|
206
|
+
y: `(h-text_h)*${t.y.toFixed(3)}`,
|
|
207
|
+
font_size: 36,
|
|
208
|
+
font_color: "white",
|
|
209
|
+
start_secs: t.startSec,
|
|
210
|
+
end_secs: t.startSec + t.durationSec
|
|
211
|
+
}, "OVERLAY_TEXT");
|
|
212
|
+
}
|
|
213
|
+
return finalUrl;
|
|
214
|
+
}export{renderExportSpec};//# sourceMappingURL=exportRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exportRenderer.js","sources":["../../../../src/features/canvas/videoEditor/exportRenderer.ts"],"sourcesContent":["/**\n * REMOTE-SIDE export renderer - the connector chain that turns an editor\n * timeline into one rendered mp4, ported from the hosts' videoConnectorClient\n * so binaries without the onExportVideo seam still export OTA.\n *\n * Transport-agnostic on purpose: it drives a RunMediaAction (host seam or\n * remoteMediaClient fallback, the caller decides) and an optional uploader\n * for phone-local clip sources. Keep the op sequence in lockstep with the\n * hosts' renderExportSpec - clips (SLIDESHOW / TRIM / SPEED / MUTE / VOLUME /\n * COLOR_ADJUST) -> CONCAT -> voiceover ADD_AUDIO -> OVERLAY_TEXT titles.\n */\nimport type { VideoExportSpec } from './editorModel';\nimport { resultUrl, type RunMediaAction } from './mediaActions';\nimport { colorFromSolidSrc, solidColorPngDataUrl } from './solidColorPng';\n\nconst VIDEO = 'yantra-video-editing';\n\n/** Server-side grade per editor filter id - COLOR_ADJUST params. */\nconst FILTER_GRADE: Record<string, Record<string, number> | null> = {\n none: null,\n cinematic: { contrast: 1.12, saturation: 0.92, brightness: -0.04 },\n film: { saturation: 0.85, gamma: 1.05, brightness: 0.03 },\n kodak: { saturation: 1.15, gamma: 0.95, hue: 8 },\n mono: { saturation: 0, contrast: 1.08 },\n vivid: { contrast: 1.15, saturation: 1.35 },\n warm: { hue: -12, saturation: 1.08, brightness: 0.03 },\n cool: { hue: 12, saturation: 0.95 },\n dreamy: { blur: 4, brightness: 0.06, saturation: 1.1 },\n};\n\nexport interface RenderProgress {\n /** Human stage label, e.g. \"Trimming clip 2/3\". */\n stage: string;\n}\n\n/** Phone-local or inline URIs the agent cannot fetch. */\nfunction needsUpload(url: string): boolean {\n return /^(file|ph|assets-library|content|data):/i.test(url);\n}\n\n/** Blank scenes are 1×1 GIF data URLs — slideshow needs an even PNG instead. */\nfunction imageSrcForExport(clip: VideoExportSpec['clips'][number]): string {\n const fill = clip.fillColor || colorFromSolidSrc(clip.src);\n if (fill) return solidColorPngDataUrl(fill);\n return clip.src;\n}\n\n/**\n * Compose the editor timeline through connector ops. Returns the final\n * rendered video URL (presigned storage URL from the render service).\n */\nexport async function renderExportSpec(\n spec: VideoExportSpec,\n runAction: RunMediaAction,\n uploadMedia?: (localUri: string) => Promise<string>,\n onProgress?: (p: RenderProgress) => void,\n): Promise<string> {\n const run = async (action: string, params: Record<string, unknown>, label: string) =>\n resultUrl(await runAction(VIDEO, action, params), label);\n\n const clipUrls: string[] = [];\n for (let i = 0; i < spec.clips.length; i += 1) {\n const clip = spec.clips[i];\n const label = `clip ${i + 1}/${spec.clips.length}`;\n let url = clip.type === 'image' ? imageSrcForExport(clip) : clip.src;\n\n if (needsUpload(url)) {\n if (!uploadMedia) throw new Error(`${label} is on this phone and no uploader is available`);\n onProgress?.({ stage: `Uploading ${label}` });\n url = await uploadMedia(url);\n }\n\n if (clip.type === 'image') {\n onProgress?.({ stage: `Rendering still ${label}` });\n const sec = (clip.durationSec ?? 3) / clip.speed;\n if (clip.kenBurns) {\n url = await run(\n 'YANTRA_VIDEO_EDIT_KEN_BURNS',\n {\n input_url: url,\n duration_ms: Math.round(sec * 1000),\n fps: spec.fps,\n zoom_start: clip.kenBurns.zoomStart,\n zoom_end: clip.kenBurns.zoomEnd,\n direction: clip.kenBurns.direction,\n },\n 'KEN_BURNS',\n );\n } else {\n url = await run(\n 'YANTRA_VIDEO_EDIT_SLIDESHOW',\n { input_url: url, duration_per_image: sec, fps: spec.fps },\n 'SLIDESHOW',\n );\n }\n } else {\n let end = clip.trimEndSec;\n if (clip.trimStartSec > 0 && end === null) {\n onProgress?.({ stage: `Measuring ${label}` });\n const probe = await runAction(VIDEO, 'YANTRA_VIDEO_EDIT_PROBE', { input_url: url });\n const duration = Number(\n (probe.duration_secs as number | undefined) ??\n (probe.duration as number | undefined) ??\n ((probe.format as Record<string, unknown> | undefined)?.duration as number | undefined),\n );\n if (Number.isFinite(duration) && duration > 0) end = duration;\n }\n if (end !== null && (clip.trimStartSec > 0 || end > 0)) {\n onProgress?.({ stage: `Trimming ${label}` });\n url = await run(\n 'YANTRA_VIDEO_EDIT_TRIM',\n { input_url: url, start_secs: clip.trimStartSec, end_secs: end },\n 'TRIM',\n );\n }\n if (clip.speed !== 1) {\n onProgress?.({ stage: `Speed ${clip.speed}x ${label}` });\n url = await run('YANTRA_VIDEO_EDIT_SPEED', { input_url: url, factor: clip.speed }, 'SPEED');\n }\n if (clip.muted) {\n onProgress?.({ stage: `Muting ${label}` });\n url = await run('YANTRA_VIDEO_EDIT_MUTE', { input_url: url }, 'MUTE');\n } else if (clip.volume < 0.99) {\n onProgress?.({ stage: `Volume ${label}` });\n url = await run('YANTRA_VIDEO_EDIT_VOLUME', { input_url: url, level: clip.volume }, 'VOLUME');\n }\n }\n\n const grade = FILTER_GRADE[clip.filter] ?? null;\n if (grade) {\n onProgress?.({ stage: `Grading ${label}` });\n url = await run('YANTRA_VIDEO_EDIT_COLOR_ADJUST', { input_url: url, ...grade }, 'COLOR_ADJUST');\n }\n clipUrls.push(url);\n }\n\n if (clipUrls.length === 0) throw new Error('Nothing to render');\n let finalUrl = clipUrls[0];\n if (clipUrls.length > 1) {\n onProgress?.({ stage: `Joining ${clipUrls.length} clips` });\n finalUrl = await run(\n 'YANTRA_VIDEO_EDIT_CONCAT',\n { input_url: clipUrls[0], input_urls: clipUrls.slice(1), reencode: true },\n 'CONCAT',\n );\n }\n\n if (spec.soundtrack) {\n // Music bed first: replace-mode swaps the clips' own audio for the\n // track, and the voiceover then mixes ON TOP so narration always\n // survives whichever soundtrack mode is chosen.\n onProgress?.({ stage: 'Adding soundtrack' });\n finalUrl = await run(\n 'YANTRA_VIDEO_EDIT_ADD_AUDIO',\n {\n input_url: finalUrl,\n audio_input_url: spec.soundtrack.audioUrl,\n replace_existing: spec.soundtrack.mode === 'replace',\n },\n 'ADD_AUDIO',\n );\n }\n\n if (spec.voiceover) {\n // The generated narration muxes under the finished cut - after concat,\n // before titles, so text timings stay relative to the final video.\n onProgress?.({ stage: 'Adding voiceover' });\n finalUrl = await run(\n 'YANTRA_VIDEO_EDIT_ADD_AUDIO',\n {\n input_url: finalUrl,\n audio_input_url: spec.voiceover.audioUrl,\n // A replace-mode voiceover must not erase the soundtrack that\n // was muxed one step earlier - narration mixes over it.\n replace_existing: spec.voiceover.mode === 'replace' && !spec.soundtrack,\n },\n 'ADD_AUDIO',\n );\n }\n\n for (let i = 0; i < spec.texts.length; i += 1) {\n const t = spec.texts[i];\n onProgress?.({ stage: `Title ${i + 1}/${spec.texts.length}` });\n finalUrl = await run(\n 'YANTRA_VIDEO_EDIT_OVERLAY_TEXT',\n {\n input_url: finalUrl,\n text: t.text,\n // Normalized editor position -> ffmpeg expressions over the\n // actual frame size, anchored at the text centre.\n x: `(w-text_w)*${t.x.toFixed(3)}`,\n y: `(h-text_h)*${t.y.toFixed(3)}`,\n font_size: 36,\n font_color: 'white',\n start_secs: t.startSec,\n end_secs: t.startSec + t.durationSec,\n },\n 'OVERLAY_TEXT',\n );\n }\n\n return finalUrl;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const FILTER_PRESETS = [{
|
|
2
|
+
id: "none",
|
|
3
|
+
label: "None",
|
|
4
|
+
overlays: []
|
|
5
|
+
}, {
|
|
6
|
+
id: "cinematic",
|
|
7
|
+
label: "Cinematic",
|
|
8
|
+
overlays: [["#0b3a4a", 0.18], ["#ff8a3d", 0.08]]
|
|
9
|
+
}, {
|
|
10
|
+
id: "film",
|
|
11
|
+
label: "Film",
|
|
12
|
+
overlays: [["#efe3c8", 0.14], ["#2b2320", 0.1]]
|
|
13
|
+
}, {
|
|
14
|
+
id: "kodak",
|
|
15
|
+
label: "Kodak",
|
|
16
|
+
overlays: [["#f5c04a", 0.16], ["#7a1f1f", 0.06]]
|
|
17
|
+
}, {
|
|
18
|
+
id: "mono",
|
|
19
|
+
label: "Mono",
|
|
20
|
+
overlays: [["#0f172a", 0.35], ["#f8fafc", 0.12]]
|
|
21
|
+
}, {
|
|
22
|
+
id: "vivid",
|
|
23
|
+
label: "Vivid",
|
|
24
|
+
overlays: [["#ff4d00", 0.12]]
|
|
25
|
+
}, {
|
|
26
|
+
id: "warm",
|
|
27
|
+
label: "Warm",
|
|
28
|
+
overlays: [["#f5c04a", 0.18]]
|
|
29
|
+
}, {
|
|
30
|
+
id: "cool",
|
|
31
|
+
label: "Cool",
|
|
32
|
+
overlays: [["#3b82f6", 0.16]]
|
|
33
|
+
}, {
|
|
34
|
+
id: "dreamy",
|
|
35
|
+
label: "Dreamy",
|
|
36
|
+
overlays: [["#ffffff", 0.1], ["#c4b5fd", 0.12]]
|
|
37
|
+
}];
|
|
38
|
+
function filterById(id) {
|
|
39
|
+
var _a;
|
|
40
|
+
return (_a = FILTER_PRESETS.find((f) => f.id === id)) != null ? _a : FILTER_PRESETS[0];
|
|
41
|
+
}export{FILTER_PRESETS,filterById};//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sources":["../../../../src/features/canvas/videoEditor/filters.ts"],"sourcesContent":["/**\n * Filter presets. On device the preview approximates each look with tint\n * overlays (RN has no shader pipeline without Skia); the render service\n * applies the real grade from the filter id in the export spec. The overlay\n * recipe lives here so the carousel thumbnail and the preview agree.\n */\nimport type { FilterId } from './editorModel';\n\nexport interface FilterPreset {\n id: FilterId;\n label: string;\n /** Stacked tint layers: [color, opacity]. Empty = untouched. */\n overlays: ReadonlyArray<readonly [string, number]>;\n}\n\nexport const FILTER_PRESETS: readonly FilterPreset[] = [\n { id: 'none', label: 'None', overlays: [] },\n {\n id: 'cinematic',\n label: 'Cinematic',\n overlays: [\n ['#0b3a4a', 0.18],\n ['#ff8a3d', 0.08],\n ],\n },\n {\n id: 'film',\n label: 'Film',\n overlays: [\n ['#efe3c8', 0.14],\n ['#2b2320', 0.1],\n ],\n },\n {\n id: 'kodak',\n label: 'Kodak',\n overlays: [\n ['#f5c04a', 0.16],\n ['#7a1f1f', 0.06],\n ],\n },\n {\n id: 'mono',\n label: 'Mono',\n overlays: [\n ['#0f172a', 0.35],\n ['#f8fafc', 0.12],\n ],\n },\n { id: 'vivid', label: 'Vivid', overlays: [['#ff4d00', 0.12]] },\n { id: 'warm', label: 'Warm', overlays: [['#f5c04a', 0.18]] },\n { id: 'cool', label: 'Cool', overlays: [['#3b82f6', 0.16]] },\n {\n id: 'dreamy',\n label: 'Dreamy',\n overlays: [\n ['#ffffff', 0.1],\n ['#c4b5fd', 0.12],\n ],\n },\n];\n\nexport function filterById(id: FilterId): FilterPreset {\n return FILTER_PRESETS.find((f) => f.id === id) ?? FILTER_PRESETS[0];\n}\n"],"names":[],"mappings":"AAaO,MAAM,iBAA0C,CAAC;AAAA,EACtD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,UAAU;AACZ,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,WAAA;AAAA,EACP,QAAA,EAAU,CAAC,CAAC,SAAA,EAAW,IAAI,CAAG,EAAA,CAAC,SAAW,EAAA,IAAI,CAAC;AACjD,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,QAAA,EAAU,CAAC,CAAC,SAAA,EAAW,IAAI,CAAG,EAAA,CAAC,SAAW,EAAA,GAAG,CAAC;AAChD,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,QAAA,EAAU,CAAC,CAAC,SAAA,EAAW,IAAI,CAAG,EAAA,CAAC,SAAW,EAAA,IAAI,CAAC;AACjD,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,QAAA,EAAU,CAAC,CAAC,SAAA,EAAW,IAAI,CAAG,EAAA,CAAC,SAAW,EAAA,IAAI,CAAC;AACjD,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,QAAU,EAAA,CAAC,CAAC,SAAA,EAAW,IAAI,CAAC;AAC9B,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,QAAU,EAAA,CAAC,CAAC,SAAA,EAAW,IAAI,CAAC;AAC9B,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,QAAU,EAAA,CAAC,CAAC,SAAA,EAAW,IAAI,CAAC;AAC9B,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,QAAA,EAAU,CAAC,CAAC,SAAA,EAAW,GAAG,CAAG,EAAA,CAAC,SAAW,EAAA,IAAI,CAAC;AAChD,CAAC;AACM,SAAS,WAAW,EAA4B,EAAA;AAlDvD,EAAA,IAAA,EAAA;AAmDE,EAAO,OAAA,CAAA,EAAA,GAAA,cAAA,CAAe,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA,KAApC,IAAyC,GAAA,EAAA,GAAA,cAAA,CAAe,CAAC,CAAA;AAClE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
function friendlyMediaError(err, doing) {
|
|
2
|
+
const raw = err instanceof Error ? err.message : String(err);
|
|
3
|
+
const friendly = (() => {
|
|
4
|
+
if (/simulator|camera not available/i.test(raw)) return `This simulator has no camera. Use Photos or Files, or Record on a real iPhone \u2014 the web studio\u2019s screen recorder is desktop-only.`;
|
|
5
|
+
if (/do not match its input schema|expected type|input schema/i.test(raw)) return `The ${doing} service rejected the request format. An app or surface update usually fixes this.`;
|
|
6
|
+
if (/401|unauthori[sz]ed|invalid ?signature|session expired/i.test(raw)) return `Your session expired - sign in again, then retry the ${doing}.`;
|
|
7
|
+
if (/failed to download|404|not found/i.test(raw)) return `A file the ${doing} needs could not be fetched. It may have expired - try again.`;
|
|
8
|
+
if (/timeout|timed out|abort/i.test(raw)) return `The ${doing} took too long. Try again in a moment.`;
|
|
9
|
+
if (/network|fetch failed|connection|ENOTFOUND|ECONN/i.test(raw)) return `Could not reach the ${doing} service. Check your connection and retry.`;
|
|
10
|
+
if (/prepay|pre-?payment|insufficient (credit|balance)|quota|billing/i.test(raw)) return `This ${doing} needs studio credits. Add credits on the same account you use on web, then retry.`;
|
|
11
|
+
if (/5\d\d|exit \d+|failed:/i.test(raw)) return `The ${doing} service had a problem. Try again in a moment.`;
|
|
12
|
+
return `Something went wrong during the ${doing}.`;
|
|
13
|
+
})();
|
|
14
|
+
const detail = raw.replace(/\s+/g, " ").trim().slice(0, 160);
|
|
15
|
+
return detail ? `${friendly}
|
|
16
|
+
|
|
17
|
+
${detail}` : friendly;
|
|
18
|
+
}
|
|
19
|
+
function resultUrl(result, action) {
|
|
20
|
+
var _a, _b, _c, _d;
|
|
21
|
+
const url = (_d = (_c = (_b = (_a = result.output_url) != null ? _a : result.outputUrl) != null ? _b : result.audioUrl) != null ? _c : result.audio_url) != null ? _d : result.url;
|
|
22
|
+
if (url && typeof url === "string") return url;
|
|
23
|
+
if (Array.isArray(result.artifacts)) {
|
|
24
|
+
for (const artifact of result.artifacts) {
|
|
25
|
+
const artifactUrl = artifact == null ? void 0 : artifact.url;
|
|
26
|
+
if (typeof artifactUrl === "string" && artifactUrl) return artifactUrl;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`${action} returned no output_url`);
|
|
30
|
+
}
|
|
31
|
+
function generationMediaUrl(result) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
const root = result.data && typeof result.data === "object" ? result.data : result;
|
|
34
|
+
const samples = (_a = root.samples) != null ? _a : result.samples;
|
|
35
|
+
const uri = (_b = samples == null ? void 0 : samples[0]) == null ? void 0 : _b.uri;
|
|
36
|
+
if (typeof uri === "string" && uri) return uri;
|
|
37
|
+
try {
|
|
38
|
+
return resultUrl(result, "generate");
|
|
39
|
+
} catch (e) {
|
|
40
|
+
throw new Error("Video generation returned no media URL");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function generationImageUrl(result) {
|
|
44
|
+
const root = result.data && typeof result.data === "object" ? result.data : result;
|
|
45
|
+
for (const key of ["imageUrl", "output_url", "outputUrl", "url", "uri"]) {
|
|
46
|
+
const value = root[key];
|
|
47
|
+
if (typeof value === "string" && value) return value;
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(root.imageUrls) && typeof root.imageUrls[0] === "string" && root.imageUrls[0]) {
|
|
50
|
+
return root.imageUrls[0];
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
return resultUrl(result, "generate image");
|
|
54
|
+
} catch (e) {
|
|
55
|
+
throw new Error("Image generation returned no media URL");
|
|
56
|
+
}
|
|
57
|
+
}export{friendlyMediaError,generationImageUrl,generationMediaUrl,resultUrl};//# sourceMappingURL=mediaActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaActions.js","sources":["../../../../src/features/canvas/videoEditor/mediaActions.ts"],"sourcesContent":["/**\n * Host seam for running media-connector actions from the federated editors.\n *\n * The editors (image/audio/video) live in the REMOTE and stay transport-free;\n * the host owns auth + the agent endpoint and provides this runner (the\n * mobile hosts wrap their cdecli-agent exec client, the web wraps\n * mediaEditingRpc). Every editor \"Apply\" is one real connector op - the\n * result URL is the server-rendered truth, which is why apply-based editing\n * needs no client-side shader pipeline.\n */\nexport type MediaConnector =\n | 'yantra-image-editing'\n | 'yantra-image-generation'\n | 'yantra-audio-editing'\n | 'yantra-video-editing'\n | 'yantra-video-generation'\n | 'yantra-video-clip'\n | 'yantra-video-3d'\n | 'yantra-character'\n | 'yantra-voicebox'\n | 'yantra-audio'\n | 'yantra-storage';\n\nexport type RunMediaAction = (\n connector: MediaConnector,\n action: string,\n params: Record<string, unknown>,\n) => Promise<Record<string, unknown>>;\n\n/** Every yantra-video op reports its artifact as output_url (or a variant). */\n/**\n * Plain-language failure text for a media chain (export, voiceover,\n * soundtrack, image edit). Users get a sentence about what happened and what\n * to do; the technical detail rides underneath, truncated, so a screenshot\n * still tells support exactly which step died.\n */\nexport function friendlyMediaError(err: unknown, doing: string): string {\n const raw = err instanceof Error ? err.message : String(err);\n const friendly = (() => {\n if (/simulator|camera not available/i.test(raw))\n return `This simulator has no camera. Use Photos or Files, or Record on a real iPhone — the web studio’s screen recorder is desktop-only.`;\n if (/do not match its input schema|expected type|input schema/i.test(raw))\n return `The ${doing} service rejected the request format. An app or surface update usually fixes this.`;\n if (/401|unauthori[sz]ed|invalid ?signature|session expired/i.test(raw))\n return `Your session expired - sign in again, then retry the ${doing}.`;\n if (/failed to download|404|not found/i.test(raw))\n return `A file the ${doing} needs could not be fetched. It may have expired - try again.`;\n if (/timeout|timed out|abort/i.test(raw)) return `The ${doing} took too long. Try again in a moment.`;\n if (/network|fetch failed|connection|ENOTFOUND|ECONN/i.test(raw))\n return `Could not reach the ${doing} service. Check your connection and retry.`;\n if (/prepay|pre-?payment|insufficient (credit|balance)|quota|billing/i.test(raw))\n return `This ${doing} needs studio credits. Add credits on the same account you use on web, then retry.`;\n if (/5\\d\\d|exit \\d+|failed:/i.test(raw)) return `The ${doing} service had a problem. Try again in a moment.`;\n return `Something went wrong during the ${doing}.`;\n })();\n const detail = raw.replace(/\\s+/g, ' ').trim().slice(0, 160);\n return detail ? `${friendly}\\n\\n${detail}` : friendly;\n}\n\nexport function resultUrl(result: Record<string, unknown>, action: string): string {\n const url = (result.output_url ?? result.outputUrl ?? result.audioUrl ?? result.audio_url ?? result.url) as\n | string\n | undefined;\n if (url && typeof url === 'string') return url;\n // Generation lanes (yantra-audio RUN_PROMPT) answer with an artifacts\n // list instead of a flat url - take the first artifact that has one.\n if (Array.isArray(result.artifacts)) {\n for (const artifact of result.artifacts as Array<Record<string, unknown>>) {\n const artifactUrl = artifact?.url;\n if (typeof artifactUrl === 'string' && artifactUrl) return artifactUrl;\n }\n }\n throw new Error(`${action} returned no output_url`);\n}\n\n/**\n * Video generation (`yantra-video-generation`) answers with `samples[0].uri`\n * (Veo), not `output_url`. Prefer a hosted URL, then that Google URI.\n */\nexport function generationMediaUrl(result: Record<string, unknown>): string {\n const root = (result.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const samples = (root.samples ?? result.samples) as Array<{ uri?: string }> | undefined;\n const uri = samples?.[0]?.uri;\n if (typeof uri === 'string' && uri) return uri;\n try {\n return resultUrl(result, 'generate');\n } catch {\n throw new Error('Video generation returned no media URL');\n }\n}\n\n/** Image generation (`yantra-image-generation`) — URL or first `imageUrls` entry. */\nexport function generationImageUrl(result: Record<string, unknown>): string {\n const root = (result.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n for (const key of ['imageUrl', 'output_url', 'outputUrl', 'url', 'uri'] as const) {\n const value = root[key];\n if (typeof value === 'string' && value) return value;\n }\n if (Array.isArray(root.imageUrls) && typeof root.imageUrls[0] === 'string' && root.imageUrls[0]) {\n return root.imageUrls[0];\n }\n try {\n return resultUrl(result, 'generate image');\n } catch {\n throw new Error('Image generation returned no media URL');\n }\n}\n\n/**\n * Host microphone seam - recording is a native capability the federated\n * editors cannot ship. The remote drives the UI (button, timer); the host\n * owns the recorder. stop() resolves the captured file's local URI (upload\n * it before handing to a connector - the agent cannot fetch file://).\n */\nexport interface AudioRecorderSeam {\n start(): Promise<void>;\n stop(): Promise<string | null>;\n}\n"],"names":[],"mappings":"AAoBgB,SAAA,kBAAA,CAAmB,KAAc,KAAuB,EAAA;AACtE,EAAA,MAAM,MAAM,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,iCAAkC,CAAA,IAAA,CAAK,GAAG,CAAA,EAAU,OAAA,CAAA,2IAAA,CAAA;AACxD,IAAA,IAAI,4DAA4D,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,OAAO,KAAK,CAAA,kFAAA,CAAA;AAC9F,IAAA,IAAI,0DAA0D,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,wDAAwD,KAAK,CAAA,CAAA,CAAA;AAC7I,IAAA,IAAI,oCAAoC,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,cAAc,KAAK,CAAA,6DAAA,CAAA;AAC7E,IAAA,IAAI,2BAA2B,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,OAAO,KAAK,CAAA,sCAAA,CAAA;AAC7D,IAAA,IAAI,mDAAmD,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,uBAAuB,KAAK,CAAA,0CAAA,CAAA;AACrG,IAAA,IAAI,mEAAmE,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,QAAQ,KAAK,CAAA,kFAAA,CAAA;AACtG,IAAA,IAAI,0BAA0B,IAAK,CAAA,GAAG,CAAG,EAAA,OAAO,OAAO,KAAK,CAAA,8CAAA,CAAA;AAC5D,IAAA,OAAO,mCAAmC,KAAK,CAAA,CAAA,CAAA;AAAA,GAC9C,GAAA;AACH,EAAM,MAAA,MAAA,GAAS,GAAI,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,EAAE,IAAK,EAAA,CAAE,KAAM,CAAA,CAAA,EAAG,GAAG,CAAA;AAC3D,EAAO,OAAA,MAAA,GAAS,GAAG,QAAQ;;AAAA,EAAO,MAAM,CAAK,CAAA,GAAA,QAAA;AAC/C;AACgB,SAAA,SAAA,CAAU,QAAiC,MAAwB,EAAA;AApCnF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqCE,EAAA,MAAM,GAAO,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,UAAP,KAAA,IAAA,GAAA,EAAA,GAAqB,MAAO,CAAA,SAAA,KAA5B,IAAyC,GAAA,EAAA,GAAA,MAAA,CAAO,QAAhD,KAAA,IAAA,GAAA,EAAA,GAA4D,MAAO,CAAA,SAAA,KAAnE,YAAgF,MAAO,CAAA,GAAA;AACpG,EAAA,IAAI,GAAO,IAAA,OAAO,GAAQ,KAAA,QAAA,EAAiB,OAAA,GAAA;AAG3C,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,SAAS,CAAG,EAAA;AACnC,IAAW,KAAA,MAAA,QAAA,IAAY,OAAO,SAA6C,EAAA;AACzE,MAAA,MAAM,cAAc,QAAU,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,GAAA;AAC9B,MAAA,IAAI,OAAO,WAAA,KAAgB,QAAY,IAAA,WAAA,EAAoB,OAAA,WAAA;AAAA;AAC7D;AAEF,EAAA,MAAM,IAAI,KAAA,CAAM,CAAG,EAAA,MAAM,CAAyB,uBAAA,CAAA,CAAA;AACpD;AAMO,SAAS,mBAAmB,MAAyC,EAAA;AAtD5E,EAAA,IAAA,EAAA,EAAA,EAAA;AAuDE,EAAM,MAAA,IAAA,GAAQ,OAAO,IAAQ,IAAA,OAAO,OAAO,IAAS,KAAA,QAAA,GAAW,OAAO,IAAO,GAAA,MAAA;AAC7E,EAAA,MAAM,OAAW,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAL,KAAA,IAAA,GAAA,EAAA,GAAgB,MAAO,CAAA,OAAA;AAGxC,EAAM,MAAA,GAAA,GAAA,CAAM,EAAU,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,CAAA,CAAA,KAAV,IAAc,GAAA,MAAA,GAAA,EAAA,CAAA,GAAA;AAC1B,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,GAAA,EAAY,OAAA,GAAA;AAC3C,EAAI,IAAA;AACF,IAAO,OAAA,SAAA,CAAU,QAAQ,UAAU,CAAA;AAAA,GAC7B,CAAA,OAAA,CAAA,EAAA;AACN,IAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA;AAAA;AAE5D;AAGO,SAAS,mBAAmB,MAAyC,EAAA;AAC1E,EAAM,MAAA,IAAA,GAAQ,OAAO,IAAQ,IAAA,OAAO,OAAO,IAAS,KAAA,QAAA,GAAW,OAAO,IAAO,GAAA,MAAA;AAC7E,EAAA,KAAA,MAAW,OAAO,CAAC,UAAA,EAAY,cAAc,WAAa,EAAA,KAAA,EAAO,KAAK,CAAY,EAAA;AAChF,IAAM,MAAA,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,KAAA,EAAc,OAAA,KAAA;AAAA;AAEjD,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,SAAS,KAAK,OAAO,IAAA,CAAK,SAAU,CAAA,CAAC,CAAM,KAAA,QAAA,IAAY,IAAK,CAAA,SAAA,CAAU,CAAC,CAAG,EAAA;AAC/F,IAAO,OAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA;AAEzB,EAAI,IAAA;AACF,IAAO,OAAA,SAAA,CAAU,QAAQ,gBAAgB,CAAA;AAAA,GACnC,CAAA,OAAA,CAAA,EAAA;AACN,IAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA;AAAA;AAE5D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {uploadFilenameFor}from'./solidColorPng.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 OP_TIMEOUT_MS = 9e5;
|
|
18
|
+
function indexHost(indexUrl) {
|
|
19
|
+
var _a;
|
|
20
|
+
return (_a = indexUrl.replace(/^https?:\/\//, "").split("/")[0]) != null ? _a : "";
|
|
21
|
+
}
|
|
22
|
+
function deriveAgentEndpoint(indexUrl) {
|
|
23
|
+
const host = indexHost(indexUrl);
|
|
24
|
+
if (host.endsWith(".yantra.app")) return "https://cdecli-agent.yantra.app";
|
|
25
|
+
return "https://cdecli-agent.cdebase.dev";
|
|
26
|
+
}
|
|
27
|
+
function deriveBackendGraphqlUrl(indexUrl) {
|
|
28
|
+
const host = indexHost(indexUrl);
|
|
29
|
+
if (!host.startsWith("surface-index-backend.")) return null;
|
|
30
|
+
return `https://ideback.${host.slice("surface-index-backend.".length)}/graphql`;
|
|
31
|
+
}
|
|
32
|
+
async function execAction(agentEndpoint, backendGraphqlUrl, token, connector, action, params) {
|
|
33
|
+
const body = __spreadValues({
|
|
34
|
+
args: ["connector", "run", "-c", connector, "-a", action, "--params", JSON.stringify(params)],
|
|
35
|
+
stream: true,
|
|
36
|
+
timeout_ms: OP_TIMEOUT_MS
|
|
37
|
+
}, backendGraphqlUrl ? {
|
|
38
|
+
backend_graphql_url: backendGraphqlUrl
|
|
39
|
+
} : {});
|
|
40
|
+
const resp = await fetch(`${agentEndpoint}/v1/cdecli/exec/stream`, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"content-type": "application/json",
|
|
44
|
+
authorization: `Bearer ${token}`
|
|
45
|
+
},
|
|
46
|
+
body: JSON.stringify(body)
|
|
47
|
+
});
|
|
48
|
+
const text = await resp.text();
|
|
49
|
+
if (!resp.ok) throw new Error(`${action} failed (HTTP ${resp.status}): ${text.slice(0, 200)}`);
|
|
50
|
+
let result = null;
|
|
51
|
+
let stderr = "";
|
|
52
|
+
let exitCode;
|
|
53
|
+
const jsonTokens = [];
|
|
54
|
+
for (const rawLine of text.split("\n")) {
|
|
55
|
+
const line = rawLine.startsWith("data: ") ? rawLine.slice(6).trim() : rawLine.trim();
|
|
56
|
+
if (!line) continue;
|
|
57
|
+
let frame;
|
|
58
|
+
try {
|
|
59
|
+
frame = JSON.parse(line);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (typeof frame.exit_code === "number") exitCode = frame.exit_code;
|
|
64
|
+
if (frame.error) stderr += frame.error;
|
|
65
|
+
if (frame.type === "result" && frame.data && typeof frame.data === "object") {
|
|
66
|
+
result = frame.data;
|
|
67
|
+
} else if ((frame.type === "stderr" || frame.type === "error") && typeof frame.data === "string") {
|
|
68
|
+
stderr += frame.data;
|
|
69
|
+
} else if (frame.type === "token" && typeof frame.data === "string") {
|
|
70
|
+
jsonTokens.push(frame.data);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!result) {
|
|
74
|
+
const joined = jsonTokens.join("");
|
|
75
|
+
const start = joined.indexOf("{");
|
|
76
|
+
if (start >= 0) {
|
|
77
|
+
try {
|
|
78
|
+
result = JSON.parse(joined.slice(start));
|
|
79
|
+
} catch (e) {
|
|
80
|
+
result = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (exitCode !== void 0 && exitCode !== 0 || !result && stderr) {
|
|
85
|
+
throw new Error(`${action} failed: ${stderr.slice(0, 300) || `exit ${exitCode}`}`);
|
|
86
|
+
}
|
|
87
|
+
if (!result) throw new Error(`${action} returned no result`);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function createRemoteRunAction(token, indexUrl) {
|
|
91
|
+
const agent = deriveAgentEndpoint(indexUrl);
|
|
92
|
+
const backend = deriveBackendGraphqlUrl(indexUrl);
|
|
93
|
+
return (connector, action, params) => execAction(agent, backend, token, connector, action, params);
|
|
94
|
+
}
|
|
95
|
+
function createRemoteUploadMedia(token, indexUrl) {
|
|
96
|
+
const agent = deriveAgentEndpoint(indexUrl);
|
|
97
|
+
return async (localUri) => {
|
|
98
|
+
const blob = await (await fetch(localUri)).blob();
|
|
99
|
+
const filename = uploadFilenameFor(localUri);
|
|
100
|
+
const resp = await fetch(`${agent}/v1/files/upload?filename=${encodeURIComponent(filename)}`, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: {
|
|
103
|
+
"content-type": blob.type || "application/octet-stream",
|
|
104
|
+
authorization: `Bearer ${token}`
|
|
105
|
+
},
|
|
106
|
+
body: blob
|
|
107
|
+
});
|
|
108
|
+
if (!resp.ok) throw new Error(`Upload failed (HTTP ${resp.status}): ${(await resp.text()).slice(0, 160)}`);
|
|
109
|
+
const result = await resp.json();
|
|
110
|
+
if (!result.url) throw new Error("Upload returned no URL");
|
|
111
|
+
return result.url;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function unwrapProxyUrl(src) {
|
|
115
|
+
try {
|
|
116
|
+
const u = new URL(src);
|
|
117
|
+
if (u.pathname.includes("/v1/files/proxy")) {
|
|
118
|
+
const inner = u.searchParams.get("url");
|
|
119
|
+
if (inner) return inner;
|
|
120
|
+
}
|
|
121
|
+
} catch (e) {
|
|
122
|
+
}
|
|
123
|
+
return src;
|
|
124
|
+
}
|
|
125
|
+
function proxiedMediaUrl(indexUrl, uri) {
|
|
126
|
+
if (!uri || uri.includes("/v1/files/proxy")) return uri;
|
|
127
|
+
if (!/generativelanguage\.googleapis|googleusercontent\.com/i.test(uri)) return uri;
|
|
128
|
+
return `${deriveAgentEndpoint(indexUrl)}/v1/files/proxy?url=${encodeURIComponent(uri)}`;
|
|
129
|
+
}export{createRemoteRunAction,createRemoteUploadMedia,deriveAgentEndpoint,deriveBackendGraphqlUrl,proxiedMediaUrl,unwrapProxyUrl};//# sourceMappingURL=remoteMediaClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remoteMediaClient.js","sources":["../../../../src/features/canvas/videoEditor/remoteMediaClient.ts"],"sourcesContent":["/**\n * REMOTE-SIDE media-connector client - the fallback that makes editors work\n * on app binaries that predate the host seams.\n *\n * The connector transport is plain fetch with a bearer the remote already\n * receives (the same system JWT the surface index accepts), so nothing here\n * needs the host: the agent endpoint and backend GraphQL URL derive from the\n * environment the indexUrl names (…cdebase.dev -> cdecli-agent.cdebase.dev,\n * …yantra.app -> cdecli-agent.yantra.app; surface-index-backend.X ->\n * ideback.X). A host-provided seam still wins when present - it can carry\n * better auth refresh - this only fills the gap.\n *\n * Transport contract == the hosts' clients (exec/stream body, data: frame\n * parsing, /v1/files/upload) - keep the three in lockstep.\n */\nimport type { RunMediaAction } from './mediaActions';\nimport { uploadFilenameFor } from './solidColorPng';\n\nconst OP_TIMEOUT_MS = 900_000; // clips (yantra-video-clip) is the long pole (~15 min)\n\nfunction indexHost(indexUrl: string): string {\n return indexUrl.replace(/^https?:\\/\\//, '').split('/')[0] ?? '';\n}\n\nexport function deriveAgentEndpoint(indexUrl: string): string {\n const host = indexHost(indexUrl);\n if (host.endsWith('.yantra.app')) return 'https://cdecli-agent.yantra.app';\n return 'https://cdecli-agent.cdebase.dev';\n}\n\nexport function deriveBackendGraphqlUrl(indexUrl: string): string | null {\n const host = indexHost(indexUrl);\n if (!host.startsWith('surface-index-backend.')) return null;\n return `https://ideback.${host.slice('surface-index-backend.'.length)}/graphql`;\n}\n\ninterface ExecFrame {\n type?: string;\n data?: unknown;\n error?: string;\n exit_code?: number;\n}\n\nasync function execAction(\n agentEndpoint: string,\n backendGraphqlUrl: string | null,\n token: string,\n connector: string,\n action: string,\n params: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const body = {\n args: ['connector', 'run', '-c', connector, '-a', action, '--params', JSON.stringify(params)],\n stream: true,\n timeout_ms: OP_TIMEOUT_MS,\n ...(backendGraphqlUrl ? { backend_graphql_url: backendGraphqlUrl } : {}),\n };\n const resp = await fetch(`${agentEndpoint}/v1/cdecli/exec/stream`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${token}` },\n body: JSON.stringify(body),\n });\n const text = await resp.text();\n if (!resp.ok) throw new Error(`${action} failed (HTTP ${resp.status}): ${text.slice(0, 200)}`);\n\n let result: Record<string, unknown> | null = null;\n let stderr = '';\n let exitCode: number | undefined;\n const jsonTokens: string[] = [];\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.startsWith('data: ') ? rawLine.slice(6).trim() : rawLine.trim();\n if (!line) continue;\n let frame: ExecFrame;\n try {\n frame = JSON.parse(line) as ExecFrame;\n } catch {\n continue;\n }\n if (typeof frame.exit_code === 'number') exitCode = frame.exit_code;\n if (frame.error) stderr += frame.error;\n if (frame.type === 'result' && frame.data && typeof frame.data === 'object') {\n result = frame.data as Record<string, unknown>;\n } else if ((frame.type === 'stderr' || frame.type === 'error') && typeof frame.data === 'string') {\n stderr += frame.data;\n } else if (frame.type === 'token' && typeof frame.data === 'string') {\n jsonTokens.push(frame.data);\n }\n }\n if (!result) {\n const joined = jsonTokens.join('');\n const start = joined.indexOf('{');\n if (start >= 0) {\n try {\n result = JSON.parse(joined.slice(start)) as Record<string, unknown>;\n } catch {\n result = null;\n }\n }\n }\n if ((exitCode !== undefined && exitCode !== 0) || (!result && stderr)) {\n throw new Error(`${action} failed: ${stderr.slice(0, 300) || `exit ${exitCode}`}`);\n }\n if (!result) throw new Error(`${action} returned no result`);\n return result;\n}\n\n/** Connector runner from what the remote already holds - token + indexUrl. */\nexport function createRemoteRunAction(token: string, indexUrl: string): RunMediaAction {\n const agent = deriveAgentEndpoint(indexUrl);\n const backend = deriveBackendGraphqlUrl(indexUrl);\n return (connector, action, params) => execAction(agent, backend, token, connector, action, params);\n}\n\n/** file:// -> store URL via the agent's upload endpoint. */\nexport function createRemoteUploadMedia(token: string, indexUrl: string): (localUri: string) => Promise<string> {\n const agent = deriveAgentEndpoint(indexUrl);\n return async (localUri: string) => {\n const blob = await (await fetch(localUri)).blob();\n const filename = uploadFilenameFor(localUri);\n const resp = await fetch(`${agent}/v1/files/upload?filename=${encodeURIComponent(filename)}`, {\n method: 'POST',\n headers: { 'content-type': blob.type || 'application/octet-stream', authorization: `Bearer ${token}` },\n body: blob,\n });\n if (!resp.ok) throw new Error(`Upload failed (HTTP ${resp.status}): ${(await resp.text()).slice(0, 160)}`);\n const result = (await resp.json()) as { url?: string };\n if (!result.url) throw new Error('Upload returned no URL');\n return result.url;\n };\n}\n\n/**\n * Twin of web canvas `unwrapProxyUrl`: the connector fetches the reference\n * server-side, so pass the inner Google/store URL, not the agent proxy wrap.\n */\nexport function unwrapProxyUrl(src: string): string {\n try {\n const u = new URL(src);\n if (u.pathname.includes('/v1/files/proxy')) {\n const inner = u.searchParams.get('url');\n if (inner) return inner;\n }\n } catch {\n /* not a URL */\n }\n return src;\n}\n\n/** Google Veo URIs are not fetchable on device — route them through the agent proxy. */\nexport function proxiedMediaUrl(indexUrl: string, uri: string): string {\n if (!uri || uri.includes('/v1/files/proxy')) return uri;\n if (!/generativelanguage\\.googleapis|googleusercontent\\.com/i.test(uri)) return uri;\n return `${deriveAgentEndpoint(indexUrl)}/v1/files/proxy?url=${encodeURIComponent(uri)}`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const PNG_SIG = Uint8Array.of(137, 80, 78, 71, 13, 10, 26, 10);
|
|
2
|
+
function u32(n) {
|
|
3
|
+
return Uint8Array.of(n >>> 24 & 255, n >>> 16 & 255, n >>> 8 & 255, n & 255);
|
|
4
|
+
}
|
|
5
|
+
function concat(...parts) {
|
|
6
|
+
const out = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0));
|
|
7
|
+
let offset = 0;
|
|
8
|
+
for (const part of parts) {
|
|
9
|
+
out.set(part, offset);
|
|
10
|
+
offset += part.length;
|
|
11
|
+
}
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
14
|
+
function crc32(bytes) {
|
|
15
|
+
let crc = -1;
|
|
16
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
17
|
+
crc ^= bytes[i];
|
|
18
|
+
for (let bit = 0; bit < 8; bit += 1) crc = crc >>> 1 ^ 3988292384 & -(crc & 1);
|
|
19
|
+
}
|
|
20
|
+
return ~crc >>> 0;
|
|
21
|
+
}
|
|
22
|
+
function adler32(bytes) {
|
|
23
|
+
let a = 1;
|
|
24
|
+
let b = 0;
|
|
25
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
26
|
+
a += bytes[i];
|
|
27
|
+
if (a >= 65521) a -= 65521;
|
|
28
|
+
b += a;
|
|
29
|
+
if (b >= 65521) b -= 65521;
|
|
30
|
+
}
|
|
31
|
+
return (b << 16 | a) >>> 0;
|
|
32
|
+
}
|
|
33
|
+
function chunk(type, data) {
|
|
34
|
+
const typeBytes = Uint8Array.from([...type].map((ch) => ch.charCodeAt(0)));
|
|
35
|
+
return concat(u32(data.length), typeBytes, data, u32(crc32(concat(typeBytes, data))));
|
|
36
|
+
}
|
|
37
|
+
function zlibStore(raw) {
|
|
38
|
+
const blocks = [Uint8Array.of(120, 1)];
|
|
39
|
+
let offset = 0;
|
|
40
|
+
while (offset < raw.length) {
|
|
41
|
+
const n = Math.min(raw.length - offset, 65535);
|
|
42
|
+
const last = offset + n >= raw.length;
|
|
43
|
+
const nlen = n ^ 65535;
|
|
44
|
+
blocks.push(Uint8Array.of(last ? 1 : 0, n & 255, n >> 8 & 255, nlen & 255, nlen >> 8 & 255), raw.subarray(offset, offset + n));
|
|
45
|
+
offset += n;
|
|
46
|
+
}
|
|
47
|
+
blocks.push(u32(adler32(raw)));
|
|
48
|
+
return concat(...blocks);
|
|
49
|
+
}
|
|
50
|
+
function parseHexColor(hex) {
|
|
51
|
+
const h = hex.replace("#", "").padEnd(6, "0").slice(0, 6);
|
|
52
|
+
const r = Number.parseInt(h.slice(0, 2), 16) || 0;
|
|
53
|
+
const g = Number.parseInt(h.slice(2, 4), 16) || 0;
|
|
54
|
+
const b = Number.parseInt(h.slice(4, 6), 16) || 0;
|
|
55
|
+
return {
|
|
56
|
+
r,
|
|
57
|
+
g,
|
|
58
|
+
b,
|
|
59
|
+
hex: `#${h.toLowerCase()}`
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function colorFromSolidSrc(src) {
|
|
63
|
+
const prefix = "data:image/gif;base64,";
|
|
64
|
+
if (!src.startsWith(prefix)) return null;
|
|
65
|
+
const binary = typeof globalThis.atob === "function" ? globalThis.atob(src.slice(prefix.length)) : Buffer.from(src.slice(prefix.length), "base64").toString("binary");
|
|
66
|
+
if (binary.length < 16) return null;
|
|
67
|
+
const hex = (n) => n.toString(16).padStart(2, "0");
|
|
68
|
+
return `#${hex(binary.charCodeAt(13))}${hex(binary.charCodeAt(14))}${hex(binary.charCodeAt(15))}`;
|
|
69
|
+
}
|
|
70
|
+
function bytesToDataUrl(mime, bytes) {
|
|
71
|
+
if (typeof Buffer !== "undefined") {
|
|
72
|
+
return `data:${mime};base64,${Buffer.from(bytes).toString("base64")}`;
|
|
73
|
+
}
|
|
74
|
+
let bin = "";
|
|
75
|
+
const chunk2 = 8192;
|
|
76
|
+
for (let i = 0; i < bytes.length; i += chunk2) {
|
|
77
|
+
const slice = bytes.subarray(i, i + chunk2);
|
|
78
|
+
bin += String.fromCharCode.apply(null, Array.from(slice));
|
|
79
|
+
}
|
|
80
|
+
return `data:${mime};base64,${globalThis.btoa(bin)}`;
|
|
81
|
+
}
|
|
82
|
+
function solidColorPngDataUrl(hex, width = 640, height = 360) {
|
|
83
|
+
const w = Math.max(2, width - width % 2);
|
|
84
|
+
const h = Math.max(2, height - height % 2);
|
|
85
|
+
const {
|
|
86
|
+
r,
|
|
87
|
+
g,
|
|
88
|
+
b
|
|
89
|
+
} = parseHexColor(hex);
|
|
90
|
+
const stride = 1 + w * 3;
|
|
91
|
+
const raw = new Uint8Array(stride * h);
|
|
92
|
+
for (let y = 0; y < h; y += 1) {
|
|
93
|
+
const row = y * stride;
|
|
94
|
+
raw[row] = 0;
|
|
95
|
+
for (let x = 0; x < w; x += 1) {
|
|
96
|
+
const i = row + 1 + x * 3;
|
|
97
|
+
raw[i] = r;
|
|
98
|
+
raw[i + 1] = g;
|
|
99
|
+
raw[i + 2] = b;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const ihdr = concat(u32(w), u32(h), Uint8Array.of(8, 2, 0, 0, 0));
|
|
103
|
+
const png = concat(PNG_SIG, chunk("IHDR", ihdr), chunk("IDAT", zlibStore(raw)), chunk("IEND", new Uint8Array(0)));
|
|
104
|
+
return bytesToDataUrl("image/png", png);
|
|
105
|
+
}
|
|
106
|
+
function uploadFilenameFor(uri, prefix = "canvas") {
|
|
107
|
+
var _a, _b, _c;
|
|
108
|
+
if (uri.startsWith("data:")) {
|
|
109
|
+
const mime = ((_a = uri.slice(5).split(";")[0]) == null ? void 0 : _a.toLowerCase()) || "";
|
|
110
|
+
const ext2 = mime.includes("png") ? "png" : mime.includes("gif") ? "gif" : mime.includes("jpeg") || mime.includes("jpg") ? "jpg" : mime.includes("webp") ? "webp" : "bin";
|
|
111
|
+
return `${prefix}-${Date.now()}.${ext2}`;
|
|
112
|
+
}
|
|
113
|
+
const ext = ((_c = (_b = uri.split("?")[0].split(".").pop()) == null ? void 0 : _b.toLowerCase()) == null ? void 0 : _c.replace(/[^a-z0-9]/g, "")) || "bin";
|
|
114
|
+
return `${prefix}-${Date.now()}.${ext}`;
|
|
115
|
+
}export{bytesToDataUrl,colorFromSolidSrc,parseHexColor,solidColorPngDataUrl,uploadFilenameFor};//# sourceMappingURL=solidColorPng.js.map
|