@adminide-stack/yantra-mobile 12.0.128 → 12.0.129-alpha.1
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/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +3 -2
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +448 -105
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +237 -22
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +17 -6
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +18 -1
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/DesignCategoryGallery.js +423 -0
- package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +763 -187
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +199 -11
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +59 -40
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/aiEdit.js +4 -2
- package/lib/features/canvas/aiEdit.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
- package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
- package/lib/features/canvas/canvasTaskSync.js +34 -7
- package/lib/features/canvas/canvasTaskSync.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +23 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +10 -24
- package/lib/features/canvas/canvasTheme.js.map +1 -1
- package/lib/features/canvas/canvasUi.js +1 -1
- package/lib/features/canvas/canvasUi.js.map +1 -1
- package/lib/features/canvas/createTiles.js +17 -9
- package/lib/features/canvas/createTiles.js.map +1 -1
- package/lib/features/canvas/deepLinks.js +35 -5
- package/lib/features/canvas/deepLinks.js.map +1 -1
- package/lib/features/canvas/designCatalog.js +165 -0
- package/lib/features/canvas/designCatalog.js.map +1 -0
- package/lib/features/canvas/designCategories.js +262 -0
- package/lib/features/canvas/designCategories.js.map +1 -0
- package/lib/features/canvas/editorControls.js +406 -0
- package/lib/features/canvas/editorControls.js.map +1 -0
- package/lib/features/canvas/generationModels.js +5 -3
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generationTasks.js +162 -0
- package/lib/features/canvas/generationTasks.js.map +1 -0
- package/lib/features/canvas/generator/BottomSheet.js +167 -0
- package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
- package/lib/features/canvas/generator/DirectorSheet.js +163 -0
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
- package/lib/features/canvas/generator/ReframePreview.js +122 -0
- package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
- package/lib/features/canvas/generator/RunLogCard.js +119 -0
- package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
- package/lib/features/canvas/generator/ShotPanel.js +261 -0
- package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
- package/lib/features/canvas/generator/businessCardWidget.js +117 -0
- package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
- package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
- package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/direction.js +41 -0
- package/lib/features/canvas/generator/direction.js.map +1 -0
- package/lib/features/canvas/generator/reframeGeometry.js +108 -0
- package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
- package/lib/features/canvas/generator/runLog.js +71 -0
- package/lib/features/canvas/generator/runLog.js.map +1 -0
- package/lib/features/canvas/generator/shot.js +133 -0
- package/lib/features/canvas/generator/shot.js.map +1 -0
- package/lib/features/canvas/generator/useShotSpec.js +87 -0
- package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
- package/lib/features/canvas/home/HeroComposer.js +214 -0
- package/lib/features/canvas/home/HeroComposer.js.map +1 -0
- package/lib/features/canvas/home/HeroMonitor.js +225 -0
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
- package/lib/features/canvas/home/LookDetail.js +185 -0
- package/lib/features/canvas/home/LookDetail.js.map +1 -0
- package/lib/features/canvas/home/LoopingVideo.js +37 -0
- package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
- package/lib/features/canvas/home/TemplatesGallery.js +253 -0
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
- package/lib/features/canvas/home/heroShots.js +100 -0
- package/lib/features/canvas/home/heroShots.js.map +1 -0
- package/lib/features/canvas/homeWork.js +62 -3
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
- package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/rankedCatalogSearch.js +375 -0
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/recorder/RecordingReview.js +272 -0
- package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
- package/lib/features/canvas/recorder/RecordingsList.js +179 -0
- package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
- package/lib/features/canvas/recorder/recorderOps.js +99 -0
- package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
- package/lib/features/canvas/seedanceShowcase.js +314 -0
- package/lib/features/canvas/seedanceShowcase.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +149 -15
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/sessionRenewal.js +114 -0
- package/lib/features/canvas/sessionRenewal.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +34 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/setTurn.js +4 -2
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
- package/lib/features/canvas/set/setPresets.js +85 -0
- package/lib/features/canvas/set/setPresets.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +4 -1
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +59 -4
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +31 -4
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/surfaceIndex.js +1 -14
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +489 -0
- package/lib/features/canvas/templateSearch.js.map +1 -0
- package/lib/features/canvas/useCanvasSession.js +28 -6
- package/lib/features/canvas/useCanvasSession.js.map +1 -1
- package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
- package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
- package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/audioServices.js +165 -0
- package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
- package/lib/features/canvas/videoEditor/captions.js +144 -0
- package/lib/features/canvas/videoEditor/captions.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/editorModel.js +12 -2
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +89 -7
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/layers.js +117 -0
- package/lib/features/canvas/videoEditor/layers.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/revoice.js +138 -0
- package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
- package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
- package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
- package/lib/features/canvas/videoEditor/textMotion.js +109 -0
- package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
- package/lib/features/canvas/videoEditor/transitions.js +31 -0
- package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
- package/lib/features/chat/TemplatesChatCards.js +8 -3
- package/lib/features/chat/TemplatesChatCards.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +674 -644
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +285 -538
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/designCore.js +2 -212
- package/lib/features/design/designCore.js.map +1 -1
- package/lib/features/design/designIndex.js +1 -50
- package/lib/features/design/designIndex.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +247 -0
- package/lib/features/design/doc/aiDesign.js.map +1 -0
- package/lib/features/design/doc/artifacts.js +280 -0
- package/lib/features/design/doc/artifacts.js.map +1 -0
- package/lib/features/design/doc/chart.js +98 -0
- package/lib/features/design/doc/chart.js.map +1 -0
- package/lib/features/design/doc/crop.js +104 -0
- package/lib/features/design/doc/crop.js.map +1 -0
- package/lib/features/design/doc/curve.js +49 -0
- package/lib/features/design/doc/curve.js.map +1 -0
- package/lib/features/design/doc/docOps.js +397 -0
- package/lib/features/design/doc/docOps.js.map +1 -0
- package/lib/features/design/doc/findReplace.js +112 -0
- package/lib/features/design/doc/findReplace.js.map +1 -0
- package/lib/features/design/doc/fonts.js +79 -0
- package/lib/features/design/doc/fonts.js.map +1 -0
- package/lib/features/design/doc/frames.js +17 -0
- package/lib/features/design/doc/frames.js.map +1 -0
- package/lib/features/design/doc/geometry.js +133 -0
- package/lib/features/design/doc/geometry.js.map +1 -0
- package/lib/features/design/doc/imageAdjust.js +203 -0
- package/lib/features/design/doc/imageAdjust.js.map +1 -0
- package/lib/features/design/doc/legacyDoc.js +107 -0
- package/lib/features/design/doc/legacyDoc.js.map +1 -0
- package/lib/features/design/doc/newDoc.js +335 -0
- package/lib/features/design/doc/newDoc.js.map +1 -0
- package/lib/features/design/doc/pageRange.js +17 -0
- package/lib/features/design/doc/pageRange.js.map +1 -0
- package/lib/features/design/doc/pathScale.js +68 -0
- package/lib/features/design/doc/pathScale.js.map +1 -0
- package/lib/features/design/doc/qr.js +62 -0
- package/lib/features/design/doc/qr.js.map +1 -0
- package/lib/features/design/doc/shapes.js +366 -0
- package/lib/features/design/doc/shapes.js.map +1 -0
- package/lib/features/design/doc/sizes.js +230 -0
- package/lib/features/design/doc/sizes.js.map +1 -0
- package/lib/features/design/doc/textEffects.js +134 -0
- package/lib/features/design/doc/textEffects.js.map +1 -0
- package/lib/features/design/doc/textLayout.js +182 -0
- package/lib/features/design/doc/textLayout.js.map +1 -0
- package/lib/features/design/doc/types.js +30 -0
- package/lib/features/design/doc/types.js.map +1 -0
- package/lib/features/design/editor/AiPanel.js +194 -0
- package/lib/features/design/editor/AiPanel.js.map +1 -0
- package/lib/features/design/editor/ChartDataPanel.js +182 -0
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
- package/lib/features/design/editor/CropOverlay.js +199 -0
- package/lib/features/design/editor/CropOverlay.js.map +1 -0
- package/lib/features/design/editor/DesignCanvas.js +363 -0
- package/lib/features/design/editor/DesignCanvas.js.map +1 -0
- package/lib/features/design/editor/ExportSheet.js +123 -0
- package/lib/features/design/editor/ExportSheet.js.map +1 -0
- package/lib/features/design/editor/FindReplacePanel.js +93 -0
- package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
- package/lib/features/design/editor/ImageTools.js +188 -0
- package/lib/features/design/editor/ImageTools.js.map +1 -0
- package/lib/features/design/editor/LayerTools.js +485 -0
- package/lib/features/design/editor/LayerTools.js.map +1 -0
- package/lib/features/design/editor/PageStrip.js +203 -0
- package/lib/features/design/editor/PageStrip.js.map +1 -0
- package/lib/features/design/editor/Slideshow.js +97 -0
- package/lib/features/design/editor/Slideshow.js.map +1 -0
- package/lib/features/design/editor/ToolPanels.js +695 -0
- package/lib/features/design/editor/ToolPanels.js.map +1 -0
- package/lib/features/design/editor/controls.js +630 -0
- package/lib/features/design/editor/controls.js.map +1 -0
- package/lib/features/design/editor/useDesignSave.js +91 -0
- package/lib/features/design/editor/useDesignSave.js.map +1 -0
- package/lib/features/design/export/exportDesign.js +170 -0
- package/lib/features/design/export/exportDesign.js.map +1 -0
- package/lib/features/design/export/pdf.js +143 -0
- package/lib/features/design/export/pdf.js.map +1 -0
- package/lib/features/design/home/DesignHome.js +688 -0
- package/lib/features/design/home/DesignHome.js.map +1 -0
- package/lib/features/design/home/studioHome.js +61 -0
- package/lib/features/design/home/studioHome.js.map +1 -0
- package/lib/features/design/pickDesignImage.js +60 -0
- package/lib/features/design/pickDesignImage.js.map +1 -0
- package/lib/features/design/render/DesignPageView.js +69 -0
- package/lib/features/design/render/DesignPageView.js.map +1 -0
- package/lib/features/design/render/PageCapture.js +288 -0
- package/lib/features/design/render/PageCapture.js.map +1 -0
- package/lib/features/design/render/TextMeasure.js +115 -0
- package/lib/features/design/render/TextMeasure.js.map +1 -0
- package/lib/features/design/render/fontRegistry.js +110 -0
- package/lib/features/design/render/fontRegistry.js.map +1 -0
- package/lib/features/design/render/layers.js +392 -0
- package/lib/features/design/render/layers.js.map +1 -0
- package/lib/features/design/render/svg.js +35 -0
- package/lib/features/design/render/svg.js.map +1 -0
- package/lib/features/design/render/svgParts.js +435 -0
- package/lib/features/design/render/svgParts.js.map +1 -0
- package/lib/features/design/surface/BoardScreen.js +529 -0
- package/lib/features/design/surface/BoardScreen.js.map +1 -0
- package/lib/features/design/surface/CompareView.js +138 -0
- package/lib/features/design/surface/CompareView.js.map +1 -0
- package/lib/features/design/surface/CreationScreen.js +294 -0
- package/lib/features/design/surface/CreationScreen.js.map +1 -0
- package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
- package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
- package/lib/features/design/surface/DesignBoards.js +441 -0
- package/lib/features/design/surface/DesignBoards.js.map +1 -0
- package/lib/features/design/surface/DesignPreview.js +159 -0
- package/lib/features/design/surface/DesignPreview.js.map +1 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
- package/lib/features/design/surface/FullScreenPreview.js +59 -0
- package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
- package/lib/features/design/surface/NewSystemDialog.js +122 -0
- package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
- package/lib/features/design/surface/PickerSheet.js +175 -0
- package/lib/features/design/surface/PickerSheet.js.map +1 -0
- package/lib/features/design/surface/TemplatesGallery.js +156 -0
- package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
- package/lib/features/design/surface/WetPaint.js +140 -0
- package/lib/features/design/surface/WetPaint.js.map +1 -0
- package/lib/features/design/surface/agentTurn.js +229 -0
- package/lib/features/design/surface/agentTurn.js.map +1 -0
- package/lib/features/design/surface/designBoard.js +218 -0
- package/lib/features/design/surface/designBoard.js.map +1 -0
- package/lib/features/design/surface/designChannel.js +186 -0
- package/lib/features/design/surface/designChannel.js.map +1 -0
- package/lib/features/design/surface/designChat.js +141 -0
- package/lib/features/design/surface/designChat.js.map +1 -0
- package/lib/features/design/surface/designConnector.js +266 -0
- package/lib/features/design/surface/designConnector.js.map +1 -0
- package/lib/features/design/surface/designDocument.js +40 -0
- package/lib/features/design/surface/designDocument.js.map +1 -0
- package/lib/features/design/surface/designExport.js +55 -0
- package/lib/features/design/surface/designExport.js.map +1 -0
- package/lib/features/design/surface/designLinks.js +64 -0
- package/lib/features/design/surface/designLinks.js.map +1 -0
- package/lib/features/design/surface/designPalette.js +24 -0
- package/lib/features/design/surface/designPalette.js.map +1 -0
- package/lib/features/design/surface/designRun.js +161 -0
- package/lib/features/design/surface/designRun.js.map +1 -0
- package/lib/features/design/surface/designTheme.js +119 -0
- package/lib/features/design/surface/designTheme.js.map +1 -0
- package/lib/features/design/surface/execStream.js +206 -0
- package/lib/features/design/surface/execStream.js.map +1 -0
- package/lib/features/design/surface/metaball.js +48 -0
- package/lib/features/design/surface/metaball.js.map +1 -0
- package/lib/features/design/surface/pickReferenceFiles.js +35 -0
- package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
- package/lib/features/design/surface/useDesignSurface.js +379 -0
- package/lib/features/design/surface/useDesignSurface.js.map +1 -0
- package/lib/features/docs/DocBlockRow.js +336 -0
- package/lib/features/docs/DocBlockRow.js.map +1 -0
- package/lib/features/docs/DocsEditorExperience.js +949 -0
- package/lib/features/docs/DocsEditorExperience.js.map +1 -0
- package/lib/features/docs/DocsToolbar.js +247 -0
- package/lib/features/docs/DocsToolbar.js.map +1 -0
- package/lib/features/docs/blocks.js +560 -0
- package/lib/features/docs/blocks.js.map +1 -0
- package/lib/features/docs/docArtifacts.js +129 -0
- package/lib/features/docs/docArtifacts.js.map +1 -0
- package/lib/features/docs/docEdits.js +201 -0
- package/lib/features/docs/docEdits.js.map +1 -0
- package/lib/features/docs/docExport.js +235 -0
- package/lib/features/docs/docExport.js.map +1 -0
- package/lib/features/docs/docShare.js +62 -0
- package/lib/features/docs/docShare.js.map +1 -0
- package/lib/features/links/openInApp.js +38 -2
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/routes.json +54 -0
- package/lib/screens/DesignNative/index.js +35 -0
- package/lib/screens/DesignNative/index.js.map +1 -0
- package/package.json +4 -4
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {registerTaskResumer,hydrateCanvasTasks,addCanvasTask,patchCanvasTask,getCanvasTask,listCanvasTasks,isTerminal}from'../canvasTasks.js';import {ensureFetchableMediaUrl}from'../mediaUrls.js';import {prepareRenderTimeline}from'./exportPipeline.js';import {renderExportSpec}from'./exportRenderer.js';import {
|
|
1
|
+
import {registerTaskResumer,hydrateCanvasTasks,addCanvasTask,patchCanvasTask,getCanvasTask,listCanvasTasks,isTerminal}from'../canvasTasks.js';import {ensureFetchableMediaUrl}from'../mediaUrls.js';import {prepareRenderTimeline}from'./exportPipeline.js';import {renderExportSpec}from'./exportRenderer.js';import {submitRenderTimelineWithJob,RENDER_POLL_MAX_MS,renderDeadline,RENDER_POLL_EVERY_MS,pollRenderTimeline,MAX_POLL_ERRORS}from'./renderTimeline.js';import {registerExportJob,forgetServerJob,canvasJobKey,jobDeadlineAt,serverJobId,lookupRemoteJobId,awaitAgentVerdict,serverProgressLine,exportUrlFromVerdict}from'../serverTasks.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -17,10 +17,23 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
async function awaitAgentForExport(id, task, onProgress) {
|
|
21
|
+
var _a, _b, _c;
|
|
22
|
+
const remoteId = (_a = serverJobId(canvasJobKey(id))) != null ? _a : await lookupRemoteJobId(id).catch(() => void 0);
|
|
23
|
+
if (!remoteId) return null;
|
|
24
|
+
const startedAt = (_b = task.startedAt) != null ? _b : task.createdAt;
|
|
25
|
+
return awaitAgentVerdict(remoteId, {
|
|
26
|
+
submittedAt: startedAt,
|
|
27
|
+
deadlineAt: (_c = task.deadlineAt) != null ? _c : renderDeadline(startedAt, task.render),
|
|
28
|
+
onProgress
|
|
29
|
+
});
|
|
30
|
+
}
|
|
20
31
|
const defaultDeps = {
|
|
21
32
|
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
22
33
|
now: () => Date.now(),
|
|
23
|
-
renderLocally: renderExportSpec
|
|
34
|
+
renderLocally: renderExportSpec,
|
|
35
|
+
record: registerExportJob,
|
|
36
|
+
awaitAgent: awaitAgentForExport
|
|
24
37
|
};
|
|
25
38
|
let deps = defaultDeps;
|
|
26
39
|
const pollers = /* @__PURE__ */ new Map();
|
|
@@ -66,13 +79,15 @@ async function startExportTask(run, input) {
|
|
|
66
79
|
return id;
|
|
67
80
|
}
|
|
68
81
|
async function runExport(run, id, input) {
|
|
82
|
+
var _a;
|
|
69
83
|
const line = (lastLine) => {
|
|
70
|
-
var
|
|
71
|
-
if (((
|
|
84
|
+
var _a2;
|
|
85
|
+
if (((_a2 = getCanvasTask(id)) == null ? void 0 : _a2.state) === "submitting") patchCanvasTask(id, {
|
|
72
86
|
lastLine
|
|
73
87
|
});
|
|
74
88
|
};
|
|
75
89
|
let handle;
|
|
90
|
+
let handed = false;
|
|
76
91
|
try {
|
|
77
92
|
const compiled = await prepareRenderTimeline(input.spec, run, {
|
|
78
93
|
upload: input.upload,
|
|
@@ -91,10 +106,17 @@ async function runExport(run, id, input) {
|
|
|
91
106
|
return;
|
|
92
107
|
}
|
|
93
108
|
line("Starting the render\u2026");
|
|
109
|
+
const current = getCanvasTask(id);
|
|
110
|
+
const job = current ? await deps.record(current, () => Boolean(getCanvasTask(id))).catch(() => void 0) : void 0;
|
|
94
111
|
try {
|
|
95
|
-
|
|
112
|
+
const submitted = await submitRenderTimelineWithJob(run, compiled, job ? {
|
|
113
|
+
job
|
|
114
|
+
} : {});
|
|
115
|
+
handle = submitted.handle;
|
|
116
|
+
handed = submitted.handed;
|
|
96
117
|
} catch (err) {
|
|
97
118
|
if (!getCanvasTask(id)) return;
|
|
119
|
+
forgetServerJob(canvasJobKey(id));
|
|
98
120
|
await renderLocally(run, id, input, err);
|
|
99
121
|
return;
|
|
100
122
|
}
|
|
@@ -107,13 +129,18 @@ async function runExport(run, id, input) {
|
|
|
107
129
|
return;
|
|
108
130
|
}
|
|
109
131
|
if (!getCanvasTask(id)) return;
|
|
110
|
-
|
|
132
|
+
const startedAt = deps.now();
|
|
133
|
+
patchCanvasTask(id, __spreadValues(__spreadValues({
|
|
111
134
|
state: "running",
|
|
112
135
|
render: handle,
|
|
113
|
-
startedAt
|
|
136
|
+
startedAt,
|
|
137
|
+
// The lease is known now: the deadline is the render's own.
|
|
138
|
+
deadlineAt: jobDeadlineAt(startedAt, (_a = handle.leaseMs) != null ? _a : RENDER_POLL_MAX_MS),
|
|
114
139
|
lastLine: "Rendering\u2026"
|
|
115
140
|
}, handle.notice ? {
|
|
116
141
|
notice: handle.notice
|
|
142
|
+
} : {}), handed ? {
|
|
143
|
+
agentReports: true
|
|
117
144
|
} : {}));
|
|
118
145
|
follow(run, id);
|
|
119
146
|
}
|
|
@@ -147,8 +174,63 @@ function follow(run, id) {
|
|
|
147
174
|
const job = poll(run, id).finally(() => pollers.delete(id));
|
|
148
175
|
pollers.set(id, job);
|
|
149
176
|
}
|
|
177
|
+
async function awaitAgentFor(id) {
|
|
178
|
+
var _a;
|
|
179
|
+
const task = getCanvasTask(id);
|
|
180
|
+
if (!(task == null ? void 0 : task.agentReports) || task.state !== "running") return false;
|
|
181
|
+
let verdict;
|
|
182
|
+
try {
|
|
183
|
+
verdict = await deps.awaitAgent(id, task, (row) => {
|
|
184
|
+
var _a2;
|
|
185
|
+
if (((_a2 = getCanvasTask(id)) == null ? void 0 : _a2.state) !== "running") return;
|
|
186
|
+
const line = serverProgressLine(row);
|
|
187
|
+
patchCanvasTask(id, __spreadValues(__spreadValues({}, row.stage ? {
|
|
188
|
+
step: {
|
|
189
|
+
index: row.stage.index,
|
|
190
|
+
total: row.stage.total,
|
|
191
|
+
label: row.stage.label
|
|
192
|
+
}
|
|
193
|
+
} : {}), line ? {
|
|
194
|
+
lastLine: line
|
|
195
|
+
} : {}));
|
|
196
|
+
});
|
|
197
|
+
} catch (err) {
|
|
198
|
+
settle(id, {
|
|
199
|
+
state: "failed",
|
|
200
|
+
error: errorText(err, "The render stopped responding"),
|
|
201
|
+
lastLine: "Failed"
|
|
202
|
+
});
|
|
203
|
+
forgetServerJob(canvasJobKey(id));
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
const current = getCanvasTask(id);
|
|
207
|
+
if (!current) return true;
|
|
208
|
+
if (!verdict) {
|
|
209
|
+
patchCanvasTask(id, {
|
|
210
|
+
agentReports: false
|
|
211
|
+
});
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
if (current.state !== "running") return true;
|
|
215
|
+
const url = verdict.state === "succeeded" ? exportUrlFromVerdict(verdict) || ((_a = current.render) == null ? void 0 : _a.outputUrl) : void 0;
|
|
216
|
+
settle(id, url ? {
|
|
217
|
+
state: "succeeded",
|
|
218
|
+
result: exportResult(url, current),
|
|
219
|
+
lastLine: "Ready",
|
|
220
|
+
verdictBy: verdict.verdictBy
|
|
221
|
+
} : __spreadValues({
|
|
222
|
+
state: "failed",
|
|
223
|
+
error: verdict.error || "The render failed",
|
|
224
|
+
lastLine: "Failed"
|
|
225
|
+
}, verdict.verdictBy ? {
|
|
226
|
+
verdictBy: verdict.verdictBy
|
|
227
|
+
} : {}));
|
|
228
|
+
forgetServerJob(canvasJobKey(id));
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
150
231
|
async function poll(run, id) {
|
|
151
232
|
var _a;
|
|
233
|
+
if (await awaitAgentFor(id)) return;
|
|
152
234
|
const start = getCanvasTask(id);
|
|
153
235
|
if (!(start == null ? void 0 : start.render) || start.state !== "running") return;
|
|
154
236
|
const handle = start.render;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportTask.js","sources":["../../../../src/features/canvas/videoEditor/exportTask.ts"],"sourcesContent":["/**\n * Durable video-editor export - native twin of web tasks/exportTask.ts.\n *\n * The editor's spec is prepared + compiled (exportPipeline), handed to the\n * connector's detached render (RENDER_TIMELINE_SUBMIT), and polled from\n * module scope as a canvasTasks entry of kind 'export' - so the editor can\n * close, the board can change and a relaunch picks the render back up from\n * the stored handle (canvasTasks.resumePromoTasks -> resumeExportTasks).\n *\n * When SUBMIT is rejected or unavailable (an older connector), the in-app\n * client chain (exportRenderer.renderExportSpec) renders it instead - not\n * durable, but it still exports.\n */\nimport {\n addCanvasTask,\n getCanvasTask,\n hydrateCanvasTasks,\n isTerminal,\n listCanvasTasks,\n patchCanvasTask,\n registerTaskResumer,\n type CanvasTask,\n} from '../canvasTasks';\nimport type { PromoRunResult } from '../promoVideo';\nimport { ensureFetchableMediaUrl } from '../mediaUrls';\nimport type { VideoExportSpec } from './editorModel';\nimport { prepareRenderTimeline } from './exportPipeline';\nimport { renderExportSpec } from './exportRenderer';\nimport type { RunMediaAction } from './mediaActions';\nimport {\n MAX_POLL_ERRORS,\n RENDER_POLL_EVERY_MS,\n pollRenderTimeline,\n renderDeadline,\n submitRenderTimeline,\n type RenderHandle,\n type RenderPoll,\n} from './renderTimeline';\n\nexport interface ExportTaskDeps {\n sleep: (ms: number) => Promise<void>;\n now: () => number;\n /** The client-chain fallback, replaceable in tests. */\n renderLocally: typeof renderExportSpec;\n}\n\nconst defaultDeps: ExportTaskDeps = {\n sleep: (ms) => new Promise((r) => setTimeout(r, ms)),\n now: () => Date.now(),\n renderLocally: renderExportSpec,\n};\nlet deps = defaultDeps;\n\n/** Test seam: fake clock/sleep/fallback; null restores the defaults. */\nexport function configureExportTaskDeps(next: Partial<ExportTaskDeps> | null): void {\n deps = next ? { ...defaultDeps, ...next } : defaultDeps;\n pollers.clear();\n working.clear();\n}\n\nexport interface StartExportTaskInput {\n spec: VideoExportSpec;\n boardId: string;\n /** The project's title - what the card shows. */\n brief: string;\n /** Host uploader for phone-local clips. */\n upload?: (localUri: string) => Promise<string>;\n}\n\n/** Renders this process is following (never doubled up by a resume). */\nconst pollers = new Map<string, Promise<void>>();\n/** Exports this process is still preparing/submitting or rendering locally. */\nconst working = new Set<string>();\n\nlet seq = 0;\nconst newId = () => `export-${Date.now().toString(36)}-${(seq++).toString(36)}`;\n\nconst stepLine = (poll: RenderPoll): string =>\n poll.step ? `Step ${poll.step.index} of ${poll.step.total} · ${poll.step.label}` : poll.label || 'Rendering…';\n\nconst errorText = (err: unknown, fallback: string): string =>\n (err instanceof Error ? err.message : typeof err === 'string' ? err : '') || fallback;\n\nconst settle = (id: string, patch: Partial<CanvasTask>) => patchCanvasTask(id, { ...patch, endedAt: deps.now() });\n\nfunction exportResult(url: string, task: CanvasTask | undefined): PromoRunResult {\n return {\n url,\n title: task?.brief || 'Video export',\n projectId: task?.render?.runId ?? task?.id ?? '',\n preset: 'export',\n pipeline: task?.local ? 'client-chain' : 'render-timeline',\n };\n}\n\n/**\n * Register an export task and start it. Resolves with the task id as soon as\n * it is registered; preparation, the SUBMIT and the poll carry on by\n * themselves (watch it with subscribeCanvasTasks / getCanvasTask).\n */\nexport async function startExportTask(run: RunMediaAction, input: StartExportTaskInput): Promise<string> {\n await hydrateCanvasTasks();\n const id = newId();\n addCanvasTask({\n id,\n kind: 'export',\n title: 'Video export',\n brief: input.brief,\n boardId: input.boardId,\n state: 'submitting',\n createdAt: deps.now(),\n request: { prompt: input.brief, preset: 'export', durationSeconds: 0, aspectRatio: '' },\n lastLine: 'Starting the render…',\n });\n working.add(id);\n void runExport(run, id, input).finally(() => working.delete(id));\n return id;\n}\n\nasync function runExport(run: RunMediaAction, id: string, input: StartExportTaskInput): Promise<void> {\n const line = (lastLine: string) => {\n if (getCanvasTask(id)?.state === 'submitting') patchCanvasTask(id, { lastLine });\n };\n let handle: RenderHandle;\n try {\n const compiled = await prepareRenderTimeline(input.spec, run, {\n upload: input.upload,\n refresh: (url) => ensureFetchableMediaUrl(run, url),\n onProgress: line,\n });\n if (compiled.warnings.length) patchCanvasTask(id, { warnings: compiled.warnings });\n // One untouched clip compiles to no steps: that clip is the export.\n if (compiled.steps.length === 0 && compiled.finalRef.kind === 'url') {\n settle(id, {\n state: 'succeeded',\n result: exportResult(compiled.finalRef.url, getCanvasTask(id)),\n lastLine: 'Ready',\n });\n return;\n }\n line('Starting the render…');\n try {\n handle = await submitRenderTimeline(run, compiled);\n } catch (err) {\n if (!getCanvasTask(id)) return;\n await renderLocally(run, id, input, err);\n return;\n }\n } catch (err) {\n settle(id, { state: 'failed', error: errorText(err, 'Could not start the render'), lastLine: 'Failed' });\n return;\n }\n if (!getCanvasTask(id)) return; // dismissed during the submit\n patchCanvasTask(id, {\n state: 'running',\n render: handle,\n startedAt: deps.now(),\n lastLine: 'Rendering…',\n ...(handle.notice ? { notice: handle.notice } : {}),\n });\n follow(run, id);\n}\n\n/** SUBMIT unavailable: the pre-durable client chain, in-process. */\nasync function renderLocally(run: RunMediaAction, id: string, input: StartExportTaskInput, why: unknown) {\n patchCanvasTask(id, {\n state: 'running',\n local: true,\n startedAt: deps.now(),\n lastLine: 'Rendering on this device…',\n });\n try {\n const url = await deps.renderLocally(input.spec, run, input.upload, (p) =>\n patchCanvasTask(id, { lastLine: p.stage }),\n );\n settle(id, { state: 'succeeded', result: exportResult(url, getCanvasTask(id)), lastLine: 'Ready' });\n } catch (err) {\n const submitError = errorText(why, '');\n settle(id, {\n state: 'failed',\n error: errorText(err, 'The render failed') + (submitError ? ` (render service: ${submitError})` : ''),\n lastLine: 'Failed',\n });\n }\n}\n\nfunction follow(run: RunMediaAction, id: string) {\n if (pollers.has(id)) return;\n const job = poll(run, id).finally(() => pollers.delete(id));\n pollers.set(id, job);\n}\n\n/** Keep polling one running render until it settles. The deadline is the RUN's: a relaunch never extends it. */\nasync function poll(run: RunMediaAction, id: string): Promise<void> {\n const start = getCanvasTask(id);\n if (!start?.render || start.state !== 'running') return;\n const handle = start.render;\n const deadlineAt = renderDeadline(start.startedAt ?? start.createdAt, handle);\n let errors = 0;\n while (deps.now() < deadlineAt) {\n await deps.sleep(RENDER_POLL_EVERY_MS);\n const current = getCanvasTask(id);\n if (current?.state !== 'running') return; // settled elsewhere or dismissed\n let answer: RenderPoll;\n try {\n answer = await pollRenderTimeline(run, handle);\n errors = 0;\n } catch (err) {\n if (++errors < MAX_POLL_ERRORS) continue;\n settle(id, { state: 'failed', error: errorText(err, 'Lost track of the render'), lastLine: 'Failed' });\n return;\n }\n if (answer.state === 'running') {\n patchCanvasTask(id, { ...(answer.step ? { step: answer.step } : {}), lastLine: stepLine(answer) });\n continue;\n }\n if (answer.state === 'failed') {\n settle(id, { state: 'failed', error: answer.error || 'The render failed', lastLine: 'Failed' });\n return;\n }\n settle(id, {\n state: 'succeeded',\n result: exportResult(answer.url || handle.outputUrl, current),\n lastLine: 'Ready',\n });\n return;\n }\n settle(id, {\n state: 'failed',\n error: 'The render is taking longer than expected - check back shortly.',\n lastLine: 'Timed out',\n });\n}\n\n/**\n * Pick up every export this app started and has not settled (call on app\n * open; canvasTasks.resumePromoTasks does). One caught mid-submit, or\n * rendering through the in-app chain, by an app close lost its work - it\n * fails with a reason instead of spinning forever.\n */\nexport function resumeExportTasks(run: RunMediaAction): void {\n for (const task of listCanvasTasks()) {\n if (task.kind !== 'export' || isTerminal(task.state) || pollers.has(task.id) || working.has(task.id)) continue;\n if (task.state === 'running' && task.render && !task.local) {\n follow(run, task.id);\n } else {\n settle(task.id, {\n state: 'failed',\n error: 'The app closed before the render finished starting - export again.',\n lastLine: 'Interrupted',\n });\n }\n }\n}\n\n// Resumed with the promo tasks on app start (registered, not imported, to keep canvasTasks cycle-free).\nregisterTaskResumer(resumeExportTasks);\n\n/** Whether this process is following / working on an export right now. */\nexport const isExportActive = (id: string): boolean => pollers.has(id) || working.has(id);\n"],"names":["poll"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exportTask.js","sources":["../../../../src/features/canvas/videoEditor/exportTask.ts"],"sourcesContent":["/**\n * Durable video-editor export - native twin of web tasks/exportTask.ts.\n *\n * The editor's spec is prepared + compiled (exportPipeline), handed to the\n * connector's detached render (RENDER_TIMELINE_SUBMIT), and polled from\n * module scope as a canvasTasks entry of kind 'export' - so the editor can\n * close, the board can change and a relaunch picks the render back up from\n * the stored handle (canvasTasks.resumePromoTasks -> resumeExportTasks).\n *\n * When SUBMIT is rejected or unavailable (an older connector), the in-app\n * client chain (exportRenderer.renderExportSpec) renders it instead - not\n * durable, but it still exports.\n *\n * Server job (web 0.95): the export is recorded on the Task API before the\n * SUBMIT, which carries the job with RENDER_FOLLOW. When the runner can put it\n * on the exec body the agent follows the render and reports the verdict to the\n * row; the phone then reads that row (awaitAgentVerdict) instead of polling\n * STATUS beside it, and polls itself only when the agent never took it.\n */\nimport {\n addCanvasTask,\n getCanvasTask,\n hydrateCanvasTasks,\n isTerminal,\n listCanvasTasks,\n patchCanvasTask,\n registerTaskResumer,\n type CanvasTask,\n} from '../canvasTasks';\nimport type { PromoRunResult } from '../promoVideo';\nimport { ensureFetchableMediaUrl } from '../mediaUrls';\nimport type { VideoExportSpec } from './editorModel';\nimport { prepareRenderTimeline } from './exportPipeline';\nimport { renderExportSpec } from './exportRenderer';\nimport type { RunMediaAction } from './mediaActions';\nimport {\n MAX_POLL_ERRORS,\n RENDER_POLL_EVERY_MS,\n RENDER_POLL_MAX_MS,\n pollRenderTimeline,\n renderDeadline,\n submitRenderTimelineWithJob,\n type RenderHandle,\n type RenderPoll,\n} from './renderTimeline';\nimport {\n awaitAgentVerdict,\n canvasJobKey,\n exportUrlFromVerdict,\n forgetServerJob,\n jobDeadlineAt,\n lookupRemoteJobId,\n registerExportJob,\n serverJobId,\n serverProgressLine,\n type JobRecord,\n type SurfaceJobRef,\n} from '../serverTasks';\n\nexport interface ExportTaskDeps {\n sleep: (ms: number) => Promise<void>;\n now: () => number;\n /** The client-chain fallback, replaceable in tests. */\n renderLocally: typeof renderExportSpec;\n /** Record the export's server job before the SUBMIT; undefined = no job to hand over. */\n record: (task: CanvasTask, exists: () => boolean) => Promise<SurfaceJobRef | undefined>;\n /** The agent's verdict on a handed-over export; null when it never took it (the phone polls then). */\n awaitAgent: (id: string, task: CanvasTask, onProgress: (row: JobRecord) => void) => Promise<JobRecord | null>;\n}\n\n/** Read the export's row until the agent's verdict - the row id from memory, or the listing after a relaunch. */\nasync function awaitAgentForExport(\n id: string,\n task: CanvasTask,\n onProgress: (row: JobRecord) => void,\n): Promise<JobRecord | null> {\n const remoteId = serverJobId(canvasJobKey(id)) ?? (await lookupRemoteJobId(id).catch(() => undefined));\n if (!remoteId) return null;\n const startedAt = task.startedAt ?? task.createdAt;\n return awaitAgentVerdict(remoteId, {\n submittedAt: startedAt,\n deadlineAt: task.deadlineAt ?? renderDeadline(startedAt, task.render),\n onProgress,\n });\n}\n\nconst defaultDeps: ExportTaskDeps = {\n sleep: (ms) => new Promise((r) => setTimeout(r, ms)),\n now: () => Date.now(),\n renderLocally: renderExportSpec,\n record: registerExportJob,\n awaitAgent: awaitAgentForExport,\n};\nlet deps = defaultDeps;\n\n/** Test seam: fake clock/sleep/fallback; null restores the defaults. */\nexport function configureExportTaskDeps(next: Partial<ExportTaskDeps> | null): void {\n deps = next ? { ...defaultDeps, ...next } : defaultDeps;\n pollers.clear();\n working.clear();\n}\n\nexport interface StartExportTaskInput {\n spec: VideoExportSpec;\n boardId: string;\n /** The project's title - what the card shows. */\n brief: string;\n /** Host uploader for phone-local clips. */\n upload?: (localUri: string) => Promise<string>;\n}\n\n/** Renders this process is following (never doubled up by a resume). */\nconst pollers = new Map<string, Promise<void>>();\n/** Exports this process is still preparing/submitting or rendering locally. */\nconst working = new Set<string>();\n\nlet seq = 0;\nconst newId = () => `export-${Date.now().toString(36)}-${(seq++).toString(36)}`;\n\nconst stepLine = (poll: RenderPoll): string =>\n poll.step ? `Step ${poll.step.index} of ${poll.step.total} · ${poll.step.label}` : poll.label || 'Rendering…';\n\nconst errorText = (err: unknown, fallback: string): string =>\n (err instanceof Error ? err.message : typeof err === 'string' ? err : '') || fallback;\n\nconst settle = (id: string, patch: Partial<CanvasTask>) => patchCanvasTask(id, { ...patch, endedAt: deps.now() });\n\nfunction exportResult(url: string, task: CanvasTask | undefined): PromoRunResult {\n return {\n url,\n title: task?.brief || 'Video export',\n projectId: task?.render?.runId ?? task?.id ?? '',\n preset: 'export',\n pipeline: task?.local ? 'client-chain' : 'render-timeline',\n };\n}\n\n/**\n * Register an export task and start it. Resolves with the task id as soon as\n * it is registered; preparation, the SUBMIT and the poll carry on by\n * themselves (watch it with subscribeCanvasTasks / getCanvasTask).\n */\nexport async function startExportTask(run: RunMediaAction, input: StartExportTaskInput): Promise<string> {\n await hydrateCanvasTasks();\n const id = newId();\n addCanvasTask({\n id,\n kind: 'export',\n title: 'Video export',\n brief: input.brief,\n boardId: input.boardId,\n state: 'submitting',\n createdAt: deps.now(),\n request: { prompt: input.brief, preset: 'export', durationSeconds: 0, aspectRatio: '' },\n lastLine: 'Starting the render…',\n });\n working.add(id);\n void runExport(run, id, input).finally(() => working.delete(id));\n return id;\n}\n\nasync function runExport(run: RunMediaAction, id: string, input: StartExportTaskInput): Promise<void> {\n const line = (lastLine: string) => {\n if (getCanvasTask(id)?.state === 'submitting') patchCanvasTask(id, { lastLine });\n };\n let handle: RenderHandle;\n let handed = false;\n try {\n const compiled = await prepareRenderTimeline(input.spec, run, {\n upload: input.upload,\n refresh: (url) => ensureFetchableMediaUrl(run, url),\n onProgress: line,\n });\n if (compiled.warnings.length) patchCanvasTask(id, { warnings: compiled.warnings });\n // One untouched clip compiles to no steps: that clip is the export.\n if (compiled.steps.length === 0 && compiled.finalRef.kind === 'url') {\n settle(id, {\n state: 'succeeded',\n result: exportResult(compiled.finalRef.url, getCanvasTask(id)),\n lastLine: 'Ready',\n });\n return;\n }\n line('Starting the render…');\n // Recorded before the submit (two seconds at most), so the SUBMIT can hand the agent the job.\n const current = getCanvasTask(id);\n const job = current\n ? await deps.record(current, () => Boolean(getCanvasTask(id))).catch(() => undefined)\n : undefined;\n try {\n const submitted = await submitRenderTimelineWithJob(run, compiled, job ? { job } : {});\n handle = submitted.handle;\n handed = submitted.handed;\n } catch (err) {\n if (!getCanvasTask(id)) return;\n forgetServerJob(canvasJobKey(id));\n await renderLocally(run, id, input, err);\n return;\n }\n } catch (err) {\n settle(id, { state: 'failed', error: errorText(err, 'Could not start the render'), lastLine: 'Failed' });\n return;\n }\n if (!getCanvasTask(id)) return; // dismissed during the submit\n const startedAt = deps.now();\n patchCanvasTask(id, {\n state: 'running',\n render: handle,\n startedAt,\n // The lease is known now: the deadline is the render's own.\n deadlineAt: jobDeadlineAt(startedAt, handle.leaseMs ?? RENDER_POLL_MAX_MS),\n lastLine: 'Rendering…',\n ...(handle.notice ? { notice: handle.notice } : {}),\n ...(handed ? { agentReports: true } : {}),\n });\n follow(run, id);\n}\n\n/** SUBMIT unavailable: the pre-durable client chain, in-process. */\nasync function renderLocally(run: RunMediaAction, id: string, input: StartExportTaskInput, why: unknown) {\n patchCanvasTask(id, {\n state: 'running',\n local: true,\n startedAt: deps.now(),\n lastLine: 'Rendering on this device…',\n });\n try {\n const url = await deps.renderLocally(input.spec, run, input.upload, (p) =>\n patchCanvasTask(id, { lastLine: p.stage }),\n );\n settle(id, { state: 'succeeded', result: exportResult(url, getCanvasTask(id)), lastLine: 'Ready' });\n } catch (err) {\n const submitError = errorText(why, '');\n settle(id, {\n state: 'failed',\n error: errorText(err, 'The render failed') + (submitError ? ` (render service: ${submitError})` : ''),\n lastLine: 'Failed',\n });\n }\n}\n\nfunction follow(run: RunMediaAction, id: string) {\n if (pollers.has(id)) return;\n const job = poll(run, id).finally(() => pollers.delete(id));\n pollers.set(id, job);\n}\n\n/**\n * The agent was handed this render: wait on its verdict row instead of polling\n * STATUS beside it. True when the row settled the task; false to poll as before.\n */\nasync function awaitAgentFor(id: string): Promise<boolean> {\n const task = getCanvasTask(id);\n if (!task?.agentReports || task.state !== 'running') return false;\n let verdict: JobRecord | null;\n try {\n verdict = await deps.awaitAgent(id, task, (row) => {\n if (getCanvasTask(id)?.state !== 'running') return;\n const line = serverProgressLine(row);\n patchCanvasTask(id, {\n ...(row.stage\n ? { step: { index: row.stage.index, total: row.stage.total, label: row.stage.label } }\n : {}),\n ...(line ? { lastLine: line } : {}),\n });\n });\n } catch (err) {\n settle(id, { state: 'failed', error: errorText(err, 'The render stopped responding'), lastLine: 'Failed' });\n forgetServerJob(canvasJobKey(id));\n return true;\n }\n const current = getCanvasTask(id);\n if (!current) return true; // dismissed meanwhile\n if (!verdict) {\n // An older agent ignored the job: follow the render from here.\n patchCanvasTask(id, { agentReports: false });\n return false;\n }\n if (current.state !== 'running') return true;\n const url = verdict.state === 'succeeded' ? exportUrlFromVerdict(verdict) || current.render?.outputUrl : undefined;\n settle(\n id,\n url\n ? {\n state: 'succeeded',\n result: exportResult(url, current),\n lastLine: 'Ready',\n verdictBy: verdict.verdictBy,\n }\n : {\n state: 'failed',\n error: verdict.error || 'The render failed',\n lastLine: 'Failed',\n ...(verdict.verdictBy ? { verdictBy: verdict.verdictBy } : {}),\n },\n );\n forgetServerJob(canvasJobKey(id));\n return true;\n}\n\n/** Keep polling one running render until it settles. The deadline is the RUN's: a relaunch never extends it. */\nasync function poll(run: RunMediaAction, id: string): Promise<void> {\n if (await awaitAgentFor(id)) return;\n const start = getCanvasTask(id);\n if (!start?.render || start.state !== 'running') return;\n const handle = start.render;\n const deadlineAt = renderDeadline(start.startedAt ?? start.createdAt, handle);\n let errors = 0;\n while (deps.now() < deadlineAt) {\n await deps.sleep(RENDER_POLL_EVERY_MS);\n const current = getCanvasTask(id);\n if (current?.state !== 'running') return; // settled elsewhere or dismissed\n let answer: RenderPoll;\n try {\n answer = await pollRenderTimeline(run, handle);\n errors = 0;\n } catch (err) {\n if (++errors < MAX_POLL_ERRORS) continue;\n settle(id, { state: 'failed', error: errorText(err, 'Lost track of the render'), lastLine: 'Failed' });\n return;\n }\n if (answer.state === 'running') {\n patchCanvasTask(id, { ...(answer.step ? { step: answer.step } : {}), lastLine: stepLine(answer) });\n continue;\n }\n if (answer.state === 'failed') {\n settle(id, { state: 'failed', error: answer.error || 'The render failed', lastLine: 'Failed' });\n return;\n }\n settle(id, {\n state: 'succeeded',\n result: exportResult(answer.url || handle.outputUrl, current),\n lastLine: 'Ready',\n });\n return;\n }\n settle(id, {\n state: 'failed',\n error: 'The render is taking longer than expected - check back shortly.',\n lastLine: 'Timed out',\n });\n}\n\n/**\n * Pick up every export this app started and has not settled (call on app\n * open; canvasTasks.resumePromoTasks does). One caught mid-submit, or\n * rendering through the in-app chain, by an app close lost its work - it\n * fails with a reason instead of spinning forever.\n */\nexport function resumeExportTasks(run: RunMediaAction): void {\n for (const task of listCanvasTasks()) {\n if (task.kind !== 'export' || isTerminal(task.state) || pollers.has(task.id) || working.has(task.id)) continue;\n if (task.state === 'running' && task.render && !task.local) {\n follow(run, task.id);\n } else {\n settle(task.id, {\n state: 'failed',\n error: 'The app closed before the render finished starting - export again.',\n lastLine: 'Interrupted',\n });\n }\n }\n}\n\n// Resumed with the promo tasks on app start (registered, not imported, to keep canvasTasks cycle-free).\nregisterTaskResumer(resumeExportTasks);\n\n/** Whether this process is following / working on an export right now. */\nexport const isExportActive = (id: string): boolean => pollers.has(id) || working.has(id);\n"],"names":["poll","_a"],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import {layerInView}from'./sceneLayers.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
|
+
function sceneLayerRows(timeline, sceneId) {
|
|
21
|
+
var _a, _b, _c;
|
|
22
|
+
const texts = timeline.texts.filter((t) => layerInView(t, sceneId));
|
|
23
|
+
const rows = [];
|
|
24
|
+
for (let i = texts.length - 1; i >= 0; i -= 1) {
|
|
25
|
+
const t = texts[i];
|
|
26
|
+
rows.push({
|
|
27
|
+
id: t.id,
|
|
28
|
+
kind: t.role === "caption" ? "caption" : "text",
|
|
29
|
+
label: t.text.trim() || "Text",
|
|
30
|
+
startSec: t.startSec,
|
|
31
|
+
hidden: Boolean(t.hidden),
|
|
32
|
+
canRaise: i < texts.length - 1,
|
|
33
|
+
canLower: i > 0
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
for (const s of (_a = timeline.segments) != null ? _a : []) {
|
|
37
|
+
if (!layerInView(s, sceneId)) continue;
|
|
38
|
+
rows.push({
|
|
39
|
+
id: s.id,
|
|
40
|
+
kind: "segment",
|
|
41
|
+
label: s.name,
|
|
42
|
+
startSec: s.startSec,
|
|
43
|
+
hidden: false,
|
|
44
|
+
canRaise: false,
|
|
45
|
+
canLower: false
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
for (const a of (_b = timeline.sceneAudio) != null ? _b : []) {
|
|
49
|
+
if (!layerInView(a, sceneId)) continue;
|
|
50
|
+
rows.push({
|
|
51
|
+
id: a.id,
|
|
52
|
+
kind: "audio",
|
|
53
|
+
label: (_c = a.label) != null ? _c : "Audio",
|
|
54
|
+
startSec: a.startSec,
|
|
55
|
+
hidden: false,
|
|
56
|
+
canRaise: false,
|
|
57
|
+
canLower: false
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return rows;
|
|
61
|
+
}
|
|
62
|
+
function moveTextLayer(timeline, id, dir, sceneId) {
|
|
63
|
+
const visible = timeline.texts.map((t, i) => ({
|
|
64
|
+
t,
|
|
65
|
+
i
|
|
66
|
+
})).filter(({
|
|
67
|
+
t
|
|
68
|
+
}) => layerInView(t, sceneId));
|
|
69
|
+
const at = visible.findIndex(({
|
|
70
|
+
t
|
|
71
|
+
}) => t.id === id);
|
|
72
|
+
const other = visible[at + dir];
|
|
73
|
+
if (at < 0 || !other) return timeline;
|
|
74
|
+
const texts = [...timeline.texts];
|
|
75
|
+
const a = visible[at].i;
|
|
76
|
+
const b = other.i;
|
|
77
|
+
[texts[a], texts[b]] = [texts[b], texts[a]];
|
|
78
|
+
return __spreadProps(__spreadValues({}, timeline), {
|
|
79
|
+
texts
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function toggleTextHidden(timeline, id) {
|
|
83
|
+
return __spreadProps(__spreadValues({}, timeline), {
|
|
84
|
+
texts: timeline.texts.map((t) => t.id === id ? __spreadProps(__spreadValues({}, t), {
|
|
85
|
+
hidden: !t.hidden
|
|
86
|
+
}) : t)
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function removeLayer(timeline, id) {
|
|
90
|
+
return __spreadValues(__spreadValues(__spreadProps(__spreadValues({}, timeline), {
|
|
91
|
+
texts: timeline.texts.filter((t) => t.id !== id)
|
|
92
|
+
}), timeline.segments ? {
|
|
93
|
+
segments: timeline.segments.filter((s) => s.id !== id)
|
|
94
|
+
} : {}), timeline.sceneAudio ? {
|
|
95
|
+
sceneAudio: timeline.sceneAudio.filter((a) => a.id !== id)
|
|
96
|
+
} : {});
|
|
97
|
+
}
|
|
98
|
+
const CAPTION_POSITIONS = [{
|
|
99
|
+
id: "top",
|
|
100
|
+
label: "Top",
|
|
101
|
+
y: 0.12
|
|
102
|
+
}, {
|
|
103
|
+
id: "middle",
|
|
104
|
+
label: "Middle",
|
|
105
|
+
y: 0.5
|
|
106
|
+
}, {
|
|
107
|
+
id: "bottom",
|
|
108
|
+
label: "Bottom",
|
|
109
|
+
y: 0.86
|
|
110
|
+
}];
|
|
111
|
+
function setCaptionY(timeline, y) {
|
|
112
|
+
return __spreadProps(__spreadValues({}, timeline), {
|
|
113
|
+
texts: timeline.texts.map((t) => t.role === "caption" ? __spreadProps(__spreadValues({}, t), {
|
|
114
|
+
y
|
|
115
|
+
}) : t)
|
|
116
|
+
});
|
|
117
|
+
}export{CAPTION_POSITIONS,moveTextLayer,removeLayer,sceneLayerRows,setCaptionY,toggleTextHidden};//# sourceMappingURL=layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layers.js","sources":["../../../../src/features/canvas/videoEditor/layers.ts"],"sourcesContent":["/**\n * Layers of one scene by depth (web LayersPanel): what is over what on the\n * stage, top first, and the edits the list makes. Pure.\n */\nimport type { EditorTimeline } from './editorModel';\nimport { layerInView } from './sceneLayers';\n\nexport type LayerKind = 'text' | 'caption' | 'segment' | 'audio';\n\nexport interface LayerRow {\n id: string;\n kind: LayerKind;\n label: string;\n startSec: number;\n hidden: boolean;\n /** Text layers only: can it go up / down a step. */\n canRaise: boolean;\n canLower: boolean;\n}\n\n/** Every layer showing with this scene open: texts top first, then timed effects and audio. */\nexport function sceneLayerRows(timeline: EditorTimeline, sceneId: string | null): LayerRow[] {\n const texts = timeline.texts.filter((t) => layerInView(t, sceneId));\n const rows: LayerRow[] = [];\n for (let i = texts.length - 1; i >= 0; i -= 1) {\n const t = texts[i];\n rows.push({\n id: t.id,\n kind: t.role === 'caption' ? 'caption' : 'text',\n label: t.text.trim() || 'Text',\n startSec: t.startSec,\n hidden: Boolean(t.hidden),\n canRaise: i < texts.length - 1,\n canLower: i > 0,\n });\n }\n for (const s of timeline.segments ?? []) {\n if (!layerInView(s, sceneId)) continue;\n rows.push({\n id: s.id,\n kind: 'segment',\n label: s.name,\n startSec: s.startSec,\n hidden: false,\n canRaise: false,\n canLower: false,\n });\n }\n for (const a of timeline.sceneAudio ?? []) {\n if (!layerInView(a, sceneId)) continue;\n rows.push({\n id: a.id,\n kind: 'audio',\n label: a.label ?? 'Audio',\n startSec: a.startSec,\n hidden: false,\n canRaise: false,\n canLower: false,\n });\n }\n return rows;\n}\n\n/**\n * Raise (1) or lower (-1) a text one step among the texts showing with the\n * same scene: later in the array paints on top.\n */\nexport function moveTextLayer(\n timeline: EditorTimeline,\n id: string,\n dir: 1 | -1,\n sceneId: string | null,\n): EditorTimeline {\n const visible = timeline.texts.map((t, i) => ({ t, i })).filter(({ t }) => layerInView(t, sceneId));\n const at = visible.findIndex(({ t }) => t.id === id);\n const other = visible[at + dir];\n if (at < 0 || !other) return timeline;\n const texts = [...timeline.texts];\n const a = visible[at].i;\n const b = other.i;\n [texts[a], texts[b]] = [texts[b], texts[a]];\n return { ...timeline, texts };\n}\n\nexport function toggleTextHidden(timeline: EditorTimeline, id: string): EditorTimeline {\n return { ...timeline, texts: timeline.texts.map((t) => (t.id === id ? { ...t, hidden: !t.hidden } : t)) };\n}\n\nexport function removeLayer(timeline: EditorTimeline, id: string): EditorTimeline {\n return {\n ...timeline,\n texts: timeline.texts.filter((t) => t.id !== id),\n ...(timeline.segments ? { segments: timeline.segments.filter((s) => s.id !== id) } : {}),\n ...(timeline.sceneAudio ? { sceneAudio: timeline.sceneAudio.filter((a) => a.id !== id) } : {}),\n };\n}\n\n/** Caption band positions on the frame (normalized y). */\nexport const CAPTION_POSITIONS = [\n { id: 'top', label: 'Top', y: 0.12 },\n { id: 'middle', label: 'Middle', y: 0.5 },\n { id: 'bottom', label: 'Bottom', y: 0.86 },\n] as const;\n\n/** Move every caption line to one band. */\nexport function setCaptionY(timeline: EditorTimeline, y: number): EditorTimeline {\n return { ...timeline, texts: timeline.texts.map((t) => (t.role === 'caption' ? { ...t, y } : t)) };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {uploadFilenameFor}from'./solidColorPng.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {uploadFilenameFor}from'./solidColorPng.js';import {withRenewedSignIn,ExecFailure,execFailureReason}from'../sessionRenewal.js';import {uploadViaYantraStorage}from'./storageUpload.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -82,7 +82,12 @@ async function execAction(agentEndpoint, backendGraphqlUrl, token, connector, ac
|
|
|
82
82
|
} finally {
|
|
83
83
|
clearTimeout(abortTimer);
|
|
84
84
|
}
|
|
85
|
-
if (!resp.ok)
|
|
85
|
+
if (!resp.ok) {
|
|
86
|
+
throw new ExecFailure(`${action} failed (HTTP ${resp.status}): ${text.slice(0, 200)}`, {
|
|
87
|
+
status: resp.status,
|
|
88
|
+
stderr: text.slice(0, 2e3)
|
|
89
|
+
});
|
|
90
|
+
}
|
|
86
91
|
let result = null;
|
|
87
92
|
let stderr = "";
|
|
88
93
|
let exitCode;
|
|
@@ -108,7 +113,12 @@ async function execAction(agentEndpoint, backendGraphqlUrl, token, connector, ac
|
|
|
108
113
|
}
|
|
109
114
|
if (!result) result = parseTokenResult(jsonTokens.join(""));
|
|
110
115
|
if (exitCode !== void 0 && exitCode !== 0 || !result && stderr) {
|
|
111
|
-
|
|
116
|
+
const reason = execFailureReason(stderr);
|
|
117
|
+
throw new ExecFailure(`${action} failed: ${reason.slice(0, 300) || `exit ${exitCode}`}`, {
|
|
118
|
+
status: resp.status,
|
|
119
|
+
exitCode,
|
|
120
|
+
stderr
|
|
121
|
+
});
|
|
112
122
|
}
|
|
113
123
|
if (!result) throw new Error(`${action} returned no result`);
|
|
114
124
|
return result;
|
|
@@ -116,11 +126,11 @@ async function execAction(agentEndpoint, backendGraphqlUrl, token, connector, ac
|
|
|
116
126
|
function createRemoteRunAction(token, indexUrl) {
|
|
117
127
|
const agent = deriveAgentEndpoint(indexUrl);
|
|
118
128
|
const backend = deriveBackendGraphqlUrl(indexUrl);
|
|
119
|
-
const run = (connector, action, params, extra) => execAction(agent, backend,
|
|
129
|
+
const run = (connector, action, params, extra) => withRenewedSignIn(token, backend, (bearer) => execAction(agent, backend, bearer, connector, action, params, (extra == null ? void 0 : extra.job) ? {
|
|
120
130
|
extraBody: {
|
|
121
131
|
job: extra.job
|
|
122
132
|
}
|
|
123
|
-
} : {});
|
|
133
|
+
} : {}));
|
|
124
134
|
Object.defineProperty(run, ACCEPTS_JOB, {
|
|
125
135
|
value: true
|
|
126
136
|
});
|
|
@@ -129,29 +139,46 @@ function createRemoteRunAction(token, indexUrl) {
|
|
|
129
139
|
function createRemoteConnectorExec(token, indexUrl) {
|
|
130
140
|
const agent = deriveAgentEndpoint(indexUrl);
|
|
131
141
|
const backend = deriveBackendGraphqlUrl(indexUrl);
|
|
132
|
-
return (connector, action, params, options) => execAction(agent, backend,
|
|
142
|
+
return (connector, action, params, options) => withRenewedSignIn(token, backend, (bearer) => execAction(agent, backend, bearer, connector, action, params, options));
|
|
133
143
|
}
|
|
134
144
|
function createAgentConnectorExec(token, agentEndpoint, backendGraphqlUrl = null) {
|
|
135
145
|
const agent = agentEndpoint.trim().replace(/\/+$/, "");
|
|
136
146
|
return (connector, action, params, options) => execAction(agent, backendGraphqlUrl, token, connector, action, params, options);
|
|
137
147
|
}
|
|
148
|
+
const STORAGE_TIMEOUT_MS = 6e4;
|
|
149
|
+
async function uploadViaAgentEndpoint(agent, token, blob, filename) {
|
|
150
|
+
const resp = await fetch(`${agent}/v1/files/upload?filename=${encodeURIComponent(filename)}`, {
|
|
151
|
+
method: "POST",
|
|
152
|
+
headers: {
|
|
153
|
+
"content-type": blob.type || "application/octet-stream",
|
|
154
|
+
authorization: `Bearer ${token}`
|
|
155
|
+
},
|
|
156
|
+
body: blob
|
|
157
|
+
});
|
|
158
|
+
if (!resp.ok) {
|
|
159
|
+
const text = (await resp.text()).slice(0, 160);
|
|
160
|
+
throw new ExecFailure(`Upload failed (HTTP ${resp.status}): ${text}`, {
|
|
161
|
+
status: resp.status,
|
|
162
|
+
stderr: text
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
const result = await resp.json();
|
|
166
|
+
if (!result.url) throw new Error("Upload returned no URL");
|
|
167
|
+
return result.url;
|
|
168
|
+
}
|
|
138
169
|
function createRemoteUploadMedia(token, indexUrl) {
|
|
139
170
|
const agent = deriveAgentEndpoint(indexUrl);
|
|
171
|
+
const backend = deriveBackendGraphqlUrl(indexUrl);
|
|
140
172
|
return async (localUri) => {
|
|
141
173
|
const blob = await (await fetch(localUri)).blob();
|
|
142
174
|
const filename = uploadFilenameFor(localUri);
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
151
|
-
if (!resp.ok) throw new Error(`Upload failed (HTTP ${resp.status}): ${(await resp.text()).slice(0, 160)}`);
|
|
152
|
-
const result = await resp.json();
|
|
153
|
-
if (!result.url) throw new Error("Upload returned no URL");
|
|
154
|
-
return result.url;
|
|
175
|
+
try {
|
|
176
|
+
return await withRenewedSignIn(token, backend, (bearer) => uploadViaYantraStorage(blob, filename, (action, params) => execAction(agent, backend, bearer, "yantra-storage", action, params, {
|
|
177
|
+
timeoutMs: STORAGE_TIMEOUT_MS
|
|
178
|
+
})));
|
|
179
|
+
} catch (e) {
|
|
180
|
+
return withRenewedSignIn(token, backend, (bearer) => uploadViaAgentEndpoint(agent, bearer, blob, filename));
|
|
181
|
+
}
|
|
155
182
|
};
|
|
156
183
|
}
|
|
157
184
|
function unwrapProxyUrl(src) {
|
|
@@ -1 +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\n/** Grace on top of the agent's own timeout before the phone gives up on the request. */\nconst CLIENT_ABORT_GRACE_MS = 30_000;\n\ninterface ExecFrame {\n type?: string;\n data?: unknown;\n error?: string;\n exit_code?: number;\n}\n\nconst RESULT_SENTINEL = '__CDECLI_RESULT__';\n\n/**\n * The action's JSON from streamed stdout when no `result` frame came. Connectors\n * wrap it as `__CDECLI_RESULT__{json}__CDECLI_RESULT__` after any progress text;\n * a bare object after progress text is the older form.\n */\nexport function parseTokenResult(joined: string): Record<string, unknown> | null {\n const parse = (text: string): Record<string, unknown> | null => {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n };\n const end = joined.lastIndexOf(RESULT_SENTINEL);\n const start = end > 0 ? joined.lastIndexOf(RESULT_SENTINEL, end - 1) : -1;\n if (start >= 0) return parse(joined.slice(start + RESULT_SENTINEL.length, end));\n const brace = joined.indexOf('{');\n return brace >= 0 ? parse(joined.slice(brace)) : null;\n}\n\nexport interface RemoteExecOptions {\n /** Vault credential the action runs with (`--credential-id`), e.g. a connected mailbox. */\n credentialId?: string;\n /** Agent-side timeout; the request is aborted on the phone shortly after it. */\n timeoutMs?: number;\n /**\n * Extra top-level fields for the exec body - `job` (the surface job this\n * call runs, see ../serverTasks): the agent reports the job's verdict to\n * its server row. An older agent ignores it.\n */\n extraBody?: Record<string, unknown>;\n}\n\n/** What a caller may add to one exec request. */\nexport interface ExecExtraBody {\n job?: unknown;\n}\n\n/** A RunMediaAction that can carry extra exec-body fields (`job`). */\nexport type RunMediaActionWithBody = (\n connector: Parameters<RunMediaAction>[0],\n action: string,\n params: Record<string, unknown>,\n extra?: ExecExtraBody,\n) => Promise<Record<string, unknown>>;\n\nconst ACCEPTS_JOB = '__acceptsJob';\n\n/** True for runners built here, which put `extra.job` on the exec body; a host seam may not. */\nexport function runActionAcceptsJob(run: unknown): run is RunMediaActionWithBody {\n return typeof run === 'function' && (run as unknown as Record<string, unknown>)[ACCEPTS_JOB] === true;\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 options: RemoteExecOptions = {},\n): Promise<Record<string, unknown>> {\n const timeoutMs = options.timeoutMs ?? OP_TIMEOUT_MS;\n const credentialId = options.credentialId?.trim();\n const body = {\n args: [\n 'connector',\n 'run',\n '-c',\n connector,\n '-a',\n action,\n ...(credentialId ? ['--credential-id', credentialId] : []),\n '--params',\n JSON.stringify(params),\n ],\n stream: true,\n timeout_ms: timeoutMs,\n ...(backendGraphqlUrl ? { backend_graphql_url: backendGraphqlUrl } : {}),\n ...(options.extraBody ?? {}),\n };\n // Without an abort a stalled agent leaves the caller waiting forever: the\n // screen keeps its spinner and nothing ever replaces it.\n const controller = new AbortController();\n const abortTimer = setTimeout(() => controller.abort(), timeoutMs + CLIENT_ABORT_GRACE_MS);\n let resp: Response;\n let text: string;\n try {\n 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 signal: controller.signal,\n });\n text = await resp.text();\n } catch (err) {\n if (controller.signal.aborted) throw new Error(`${action} timed out`);\n throw err;\n } finally {\n clearTimeout(abortTimer);\n }\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) result = parseTokenResult(jsonTokens.join(''));\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 // The optional 4th argument is invisible to RunMediaAction callers, so every existing call is unchanged.\n const run: RunMediaActionWithBody = (connector, action, params, extra) =>\n execAction(\n agent,\n backend,\n token,\n connector,\n action,\n params,\n extra?.job ? { extraBody: { job: extra.job } } : {},\n );\n Object.defineProperty(run, ACCEPTS_JOB, { value: true });\n return run;\n}\n\nexport type RemoteConnectorExec = (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n options?: RemoteExecOptions,\n) => Promise<Record<string, unknown>>;\n\n/** Same transport as createRemoteRunAction, for any connector, with a credential and timeout per call. */\nexport function createRemoteConnectorExec(token: string, indexUrl: string): RemoteConnectorExec {\n const agent = deriveAgentEndpoint(indexUrl);\n const backend = deriveBackendGraphqlUrl(indexUrl);\n return (connector, action, params, options) =>\n execAction(agent, backend, token, connector, action, params, options);\n}\n\n/**\n * Same transport against an agent the caller names. The host knows the agent its own chat session talks to\n * (CDECLI_AGENT_ENDPOINT); a remote only has the index URL to derive one from. A call that must reach the same\n * per-user state the chat's agent works on (the person's Computer) goes there, with the token that session uses.\n */\nexport function createAgentConnectorExec(\n token: string,\n agentEndpoint: string,\n backendGraphqlUrl: string | null = null,\n): RemoteConnectorExec {\n const agent = agentEndpoint.trim().replace(/\\/+$/, '');\n return (connector, action, params, options) =>\n execAction(agent, backendGraphqlUrl, token, connector, action, params, options);\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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"}
|
|
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 *\n * Renewed sign-in (kit 36a1d0f0, ../sessionRenewal): an exec failing with a\n * 401 - from the agent, or from the backend inside the stream - probes the\n * bearer; only a condemned one is re-minted (the session's registered\n * renewer) and the action runs once more. Uploads go through the\n * `yantra-storage` connector (./storageUpload) with /v1/files/upload as the\n * fallback.\n */\nimport type { RunMediaAction } from './mediaActions';\nimport { uploadFilenameFor } from './solidColorPng';\nimport { ExecFailure, execFailureReason, withRenewedSignIn } from '../sessionRenewal';\nimport { uploadViaYantraStorage } from './storageUpload';\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\n/** Grace on top of the agent's own timeout before the phone gives up on the request. */\nconst CLIENT_ABORT_GRACE_MS = 30_000;\n\ninterface ExecFrame {\n type?: string;\n data?: unknown;\n error?: string;\n exit_code?: number;\n}\n\nconst RESULT_SENTINEL = '__CDECLI_RESULT__';\n\n/**\n * The action's JSON from streamed stdout when no `result` frame came. Connectors\n * wrap it as `__CDECLI_RESULT__{json}__CDECLI_RESULT__` after any progress text;\n * a bare object after progress text is the older form.\n */\nexport function parseTokenResult(joined: string): Record<string, unknown> | null {\n const parse = (text: string): Record<string, unknown> | null => {\n try {\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n };\n const end = joined.lastIndexOf(RESULT_SENTINEL);\n const start = end > 0 ? joined.lastIndexOf(RESULT_SENTINEL, end - 1) : -1;\n if (start >= 0) return parse(joined.slice(start + RESULT_SENTINEL.length, end));\n const brace = joined.indexOf('{');\n return brace >= 0 ? parse(joined.slice(brace)) : null;\n}\n\nexport interface RemoteExecOptions {\n /** Vault credential the action runs with (`--credential-id`), e.g. a connected mailbox. */\n credentialId?: string;\n /** Agent-side timeout; the request is aborted on the phone shortly after it. */\n timeoutMs?: number;\n /**\n * Extra top-level fields for the exec body - `job` (the surface job this\n * call runs, see ../serverTasks): the agent reports the job's verdict to\n * its server row. An older agent ignores it.\n */\n extraBody?: Record<string, unknown>;\n}\n\n/** What a caller may add to one exec request. */\nexport interface ExecExtraBody {\n job?: unknown;\n}\n\n/** A RunMediaAction that can carry extra exec-body fields (`job`). */\nexport type RunMediaActionWithBody = (\n connector: Parameters<RunMediaAction>[0],\n action: string,\n params: Record<string, unknown>,\n extra?: ExecExtraBody,\n) => Promise<Record<string, unknown>>;\n\nconst ACCEPTS_JOB = '__acceptsJob';\n\n/** True for runners built here, which put `extra.job` on the exec body; a host seam may not. */\nexport function runActionAcceptsJob(run: unknown): run is RunMediaActionWithBody {\n return typeof run === 'function' && (run as unknown as Record<string, unknown>)[ACCEPTS_JOB] === true;\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 options: RemoteExecOptions = {},\n): Promise<Record<string, unknown>> {\n const timeoutMs = options.timeoutMs ?? OP_TIMEOUT_MS;\n const credentialId = options.credentialId?.trim();\n const body = {\n args: [\n 'connector',\n 'run',\n '-c',\n connector,\n '-a',\n action,\n ...(credentialId ? ['--credential-id', credentialId] : []),\n '--params',\n JSON.stringify(params),\n ],\n stream: true,\n timeout_ms: timeoutMs,\n ...(backendGraphqlUrl ? { backend_graphql_url: backendGraphqlUrl } : {}),\n ...(options.extraBody ?? {}),\n };\n // Without an abort a stalled agent leaves the caller waiting forever: the\n // screen keeps its spinner and nothing ever replaces it.\n const controller = new AbortController();\n const abortTimer = setTimeout(() => controller.abort(), timeoutMs + CLIENT_ABORT_GRACE_MS);\n let resp: Response;\n let text: string;\n try {\n 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 signal: controller.signal,\n });\n text = await resp.text();\n } catch (err) {\n if (controller.signal.aborted) throw new Error(`${action} timed out`);\n throw err;\n } finally {\n clearTimeout(abortTimer);\n }\n if (!resp.ok) {\n throw new ExecFailure(`${action} failed (HTTP ${resp.status}): ${text.slice(0, 200)}`, {\n status: resp.status,\n stderr: text.slice(0, 2_000),\n });\n }\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) result = parseTokenResult(jsonTokens.join(''));\n if ((exitCode !== undefined && exitCode !== 0) || (!result && stderr)) {\n const reason = execFailureReason(stderr);\n throw new ExecFailure(`${action} failed: ${reason.slice(0, 300) || `exit ${exitCode}`}`, {\n status: resp.status,\n exitCode,\n stderr,\n });\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 // The optional 4th argument is invisible to RunMediaAction callers, so every existing call is unchanged.\n const run: RunMediaActionWithBody = (connector, action, params, extra) =>\n withRenewedSignIn(token, backend, (bearer) =>\n execAction(\n agent,\n backend,\n bearer,\n connector,\n action,\n params,\n extra?.job ? { extraBody: { job: extra.job } } : {},\n ),\n );\n Object.defineProperty(run, ACCEPTS_JOB, { value: true });\n return run;\n}\n\nexport type RemoteConnectorExec = (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n options?: RemoteExecOptions,\n) => Promise<Record<string, unknown>>;\n\n/** Same transport as createRemoteRunAction, for any connector, with a credential and timeout per call. */\nexport function createRemoteConnectorExec(token: string, indexUrl: string): RemoteConnectorExec {\n const agent = deriveAgentEndpoint(indexUrl);\n const backend = deriveBackendGraphqlUrl(indexUrl);\n return (connector, action, params, options) =>\n withRenewedSignIn(token, backend, (bearer) =>\n execAction(agent, backend, bearer, connector, action, params, options),\n );\n}\n\n/**\n * Same transport against an agent the caller names. The host knows the agent its own chat session talks to\n * (CDECLI_AGENT_ENDPOINT); a remote only has the index URL to derive one from. A call that must reach the same\n * per-user state the chat's agent works on (the person's Computer) goes there, with the token that session uses.\n */\nexport function createAgentConnectorExec(\n token: string,\n agentEndpoint: string,\n backendGraphqlUrl: string | null = null,\n): RemoteConnectorExec {\n const agent = agentEndpoint.trim().replace(/\\/+$/, '');\n return (connector, action, params, options) =>\n execAction(agent, backendGraphqlUrl, token, connector, action, params, options);\n}\n\n/** Storage-connector calls are short: a link, a metadata save. */\nconst STORAGE_TIMEOUT_MS = 60_000;\n\n/** Fallback: raw upload through the agent's `/v1/files/upload` endpoint. */\nasync function uploadViaAgentEndpoint(agent: string, token: string, blob: Blob, filename: string): Promise<string> {\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) {\n const text = (await resp.text()).slice(0, 160);\n throw new ExecFailure(`Upload failed (HTTP ${resp.status}): ${text}`, { status: resp.status, stderr: text });\n }\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 * file:// -> store URL. The `yantra-storage` connector first (bytes go straight\n * to the bucket, the file lands in the platform's storage, the link lives seven\n * days); the agent's upload endpoint when that lane fails.\n */\nexport function createRemoteUploadMedia(token: string, indexUrl: string): (localUri: string) => Promise<string> {\n const agent = deriveAgentEndpoint(indexUrl);\n const backend = deriveBackendGraphqlUrl(indexUrl);\n return async (localUri: string) => {\n const blob = await (await fetch(localUri)).blob();\n const filename = uploadFilenameFor(localUri);\n try {\n return await withRenewedSignIn(token, backend, (bearer) =>\n uploadViaYantraStorage(blob, filename, (action, params) =>\n execAction(agent, backend, bearer, 'yantra-storage', action, params, {\n timeoutMs: STORAGE_TIMEOUT_MS,\n }),\n ),\n );\n } catch {\n return withRenewedSignIn(token, backend, (bearer) => uploadViaAgentEndpoint(agent, bearer, blob, filename));\n }\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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"}
|