@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129
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 {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useRef,useState}from'react';import {View,Text,ScrollView,TextInput,ActivityIndicator,StyleSheet}from'react-native';import {deriveAgentEndpoint}from'../remoteMediaClient.js';import {reflowSceneChildren}from'../sceneLayers.js';import {runCutAgentTurn}from'./agentLoop.js';import {linksIn,intakeLinks,fetchLinkViaAgent}from'./attachments.js';import {useCanvasTheme,themedStyles}from'../../canvasTheme.js';import {Pressable,pressedStyle,RADIUS,SPACE,TYPE}from'../../canvasUi.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useRef,useState}from'react';import {View,Text,ScrollView,TextInput,ActivityIndicator,StyleSheet}from'react-native';import {deriveAgentEndpoint}from'../remoteMediaClient.js';import {reflowSceneChildren}from'../sceneLayers.js';import {runCutAgentTurn}from'./agentLoop.js';import {linksIn,intakeLinks,fetchLinkViaAgent,importLink}from'./attachments.js';import {useCanvasTheme,themedStyles}from'../../canvasTheme.js';import {Pressable,pressedStyle,RADIUS,SPACE,TYPE}from'../../canvasUi.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -25,12 +25,19 @@ function AgentCutPane({
|
|
|
25
25
|
runAction,
|
|
26
26
|
uploadMedia,
|
|
27
27
|
onAddMedia,
|
|
28
|
-
onFilm
|
|
28
|
+
onFilm,
|
|
29
|
+
library,
|
|
30
|
+
sourceSec
|
|
29
31
|
}) {
|
|
30
32
|
const theme = useCanvasTheme();
|
|
31
33
|
const styles = useMemo(() => makeStyles(theme), [theme]);
|
|
32
34
|
const timelineRef = useRef(timeline);
|
|
33
35
|
timelineRef.current = timeline;
|
|
36
|
+
const libraryRef = useRef(library);
|
|
37
|
+
libraryRef.current = library;
|
|
38
|
+
const sourceSecRef = useRef(sourceSec);
|
|
39
|
+
sourceSecRef.current = sourceSec;
|
|
40
|
+
const analysesRef = useRef(/* @__PURE__ */ new Map());
|
|
34
41
|
const [prompt, setPrompt] = useState("Keep the strongest 3 clips and put the hero shot first");
|
|
35
42
|
const [busy, setBusy] = useState(false);
|
|
36
43
|
const [status, setStatus] = useState(null);
|
|
@@ -70,7 +77,7 @@ function AgentCutPane({
|
|
|
70
77
|
token,
|
|
71
78
|
agentEndpoint: deriveAgentEndpoint(indexUrl),
|
|
72
79
|
onStatus: setStatus,
|
|
73
|
-
ctx: __spreadValues({
|
|
80
|
+
ctx: __spreadValues(__spreadProps(__spreadValues(__spreadValues({
|
|
74
81
|
getTimeline: () => timelineRef.current,
|
|
75
82
|
// Scene-scoped layers move with their scenes on agent edits too.
|
|
76
83
|
setTimeline: (next) => {
|
|
@@ -80,6 +87,43 @@ function AgentCutPane({
|
|
|
80
87
|
}
|
|
81
88
|
}, onFilm ? {
|
|
82
89
|
film: onFilm
|
|
90
|
+
} : {}), runAction ? {
|
|
91
|
+
runAction
|
|
92
|
+
} : {}), {
|
|
93
|
+
analyses: analysesRef.current,
|
|
94
|
+
progress: setStatus,
|
|
95
|
+
sourceSec: () => {
|
|
96
|
+
var _a;
|
|
97
|
+
return (_a = sourceSecRef.current) != null ? _a : {};
|
|
98
|
+
},
|
|
99
|
+
library: () => {
|
|
100
|
+
var _a;
|
|
101
|
+
return ((_a = libraryRef.current) != null ? _a : []).flatMap((i) => i.type === "image" || i.type === "video" || i.type === "audio" ? [{
|
|
102
|
+
id: i.id,
|
|
103
|
+
type: i.type,
|
|
104
|
+
src: i.src,
|
|
105
|
+
name: i.generatedAssetName || i.type
|
|
106
|
+
}] : []);
|
|
107
|
+
}
|
|
108
|
+
}), runAction && uploadMedia && onAddMedia ? {
|
|
109
|
+
importLink: async (url) => {
|
|
110
|
+
const got = await importLink(url, {
|
|
111
|
+
fetchUrl: (u, accept) => fetchLinkViaAgent(runAction, u, accept),
|
|
112
|
+
upload: (dataUrl) => uploadMedia(dataUrl)
|
|
113
|
+
});
|
|
114
|
+
const id = onAddMedia({
|
|
115
|
+
type: got.kind,
|
|
116
|
+
src: got.src,
|
|
117
|
+
name: got.name
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
id,
|
|
121
|
+
type: got.kind,
|
|
122
|
+
src: got.src,
|
|
123
|
+
name: got.name,
|
|
124
|
+
sourceUrl: url
|
|
125
|
+
};
|
|
126
|
+
}
|
|
83
127
|
} : {})
|
|
84
128
|
});
|
|
85
129
|
for (const step of result.steps) setLog((l) => [...l, step.label]);
|
|
@@ -98,7 +142,7 @@ function AgentCutPane({
|
|
|
98
142
|
};
|
|
99
143
|
return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
|
|
100
144
|
/* @__PURE__ */ jsx(Text, { style: styles.title, children: "AI cut" }),
|
|
101
|
-
/* @__PURE__ */ jsx(Text, { style: styles.fine, children: "Describe the cut. The agent can
|
|
145
|
+
/* @__PURE__ */ jsx(Text, { style: styles.fine, children: "Describe the cut. The agent can read the dialogue, lay a whole cut, trim, reorder and remove clips, add scenes to film, titles, music, sound effects, voiceover and captions, and take in pasted links." }),
|
|
102
146
|
/* @__PURE__ */ jsx(ScrollView, { style: styles.log, contentContainerStyle: styles.logInner, children: log.map((line, i) => /* @__PURE__ */ jsx(Text, { style: styles.logLine, children: line }, `${i}-${line.slice(0, 12)}`)) }),
|
|
103
147
|
status ? /* @__PURE__ */ jsx(Text, { style: styles.status, children: status }) : null,
|
|
104
148
|
/* @__PURE__ */ jsx(TextInput, { value: prompt, onChangeText: setPrompt, style: styles.input, multiline: true, placeholderTextColor: theme.edInk3, placeholder: "e.g. Drop the last clip and tighten the open" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentCutPane.js","sources":["../../../../../src/features/canvas/videoEditor/agent/AgentCutPane.tsx"],"sourcesContent":["/**\n * Agentic cut pane inside the video editor: describe the cut, tools rearrange clips.\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport type { EditorTimeline } from '../editorModel';\nimport type { RunMediaAction } from '../mediaActions';\nimport { deriveAgentEndpoint } from '../remoteMediaClient';\nimport { reflowSceneChildren } from '../sceneLayers';\nimport { runCutAgentTurn } from './agentLoop';\nimport { fetchLinkViaAgent, intakeLinks, linksIn, type AgentAttachment, type LinkMediaKind } from './attachments';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../../canvasTheme';\nimport { Pressable, RADIUS, SPACE, TYPE, pressedStyle } from '../../canvasUi';\n\nexport function AgentCutPane({\n timeline,\n setTimeline,\n token,\n indexUrl,\n runAction,\n uploadMedia,\n onAddMedia,\n onFilm,\n}: {\n timeline: EditorTimeline;\n setTimeline: (next: EditorTimeline | ((prev: EditorTimeline) => EditorTimeline)) => void;\n token?: string | null;\n indexUrl?: string | null;\n /** Pasted links are fetched through the storage connector with this runner. */\n runAction?: RunMediaAction;\n /** Stores a fetched link's bytes (data: URL) and returns the hosted URL. */\n uploadMedia?: (localUri: string) => Promise<string>;\n /** Put a taken-in link into the editor library; returns its id. */\n onAddMedia?: (asset: { type: LinkMediaKind; src: string; name: string }) => string;\n /** film_scenes: film these colour scenes in the background. */\n onFilm?: (sceneIds: string[]) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = useMemo(() => makeStyles(theme), [theme]);\n const timelineRef = useRef(timeline);\n timelineRef.current = timeline;\n const [prompt, setPrompt] = useState('Keep the strongest 3 clips and put the hero shot first');\n const [busy, setBusy] = useState(false);\n const [status, setStatus] = useState<string | null>(null);\n const [log, setLog] = useState<string[]>([]);\n const [history, setHistory] = useState<Array<{ role: 'user' | 'assistant'; content: string }>>([]);\n\n const run = async () => {\n if (!token || !indexUrl) {\n setLog((l) => [...l, 'Sign in needed for AI cut.']);\n return;\n }\n const text = prompt.trim();\n if (!text || busy) return;\n setBusy(true);\n setStatus('Starting…');\n setHistory((h) => [...h, { role: 'user', content: text }]);\n try {\n // Pasted links become library media the model is told about (pictures it sees).\n let attachments: AgentAttachment[] = [];\n const links = linksIn(text);\n if (links.length && runAction && uploadMedia && onAddMedia) {\n setStatus(`Taking in ${links.length} link${links.length === 1 ? '' : 's'}…`);\n attachments = await intakeLinks(links, {\n fetchUrl: (url, accept) => fetchLinkViaAgent(runAction, url, accept),\n upload: (dataUrl) => uploadMedia(dataUrl),\n addAsset: (asset) => onAddMedia(asset),\n });\n for (const a of attachments) {\n setLog((l) => [\n ...l,\n a.kind === 'unusable' ? `Could not take in ${a.name}: ${a.reason}` : `Took in ${a.name}`,\n ]);\n }\n }\n const result = await runCutAgentTurn({\n history,\n userText: text,\n attachments,\n token,\n agentEndpoint: deriveAgentEndpoint(indexUrl),\n onStatus: setStatus,\n ctx: {\n getTimeline: () => timelineRef.current,\n // Scene-scoped layers move with their scenes on agent edits too.\n setTimeline: (next) => {\n const reflowed = reflowSceneChildren(timelineRef.current, next);\n timelineRef.current = reflowed;\n setTimeline(reflowed);\n },\n ...(onFilm ? { film: onFilm } : {}),\n },\n });\n for (const step of result.steps) setLog((l) => [...l, step.label]);\n setLog((l) => [...l, result.text]);\n setHistory((h) => [...h, { role: 'assistant', content: result.text }]);\n setPrompt('');\n } catch (err: unknown) {\n setLog((l) => [...l, err instanceof Error ? err.message : String(err)]);\n } finally {\n setBusy(false);\n setStatus(null);\n }\n };\n\n return (\n <View style={styles.root}>\n <Text style={styles.title}>AI cut</Text>\n <Text style={styles.fine}>\n Describe the cut. The agent can inspect, trim, reorder and remove clips, add scenes to film and titles,\n and take in pasted links to pictures or videos.\n </Text>\n <ScrollView style={styles.log} contentContainerStyle={styles.logInner}>\n {log.map((line, i) => (\n <Text key={`${i}-${line.slice(0, 12)}`} style={styles.logLine}>\n {line}\n </Text>\n ))}\n </ScrollView>\n {status ? <Text style={styles.status}>{status}</Text> : null}\n <TextInput\n value={prompt}\n onChangeText={setPrompt}\n style={styles.input}\n multiline\n placeholderTextColor={theme.edInk3}\n placeholder=\"e.g. Drop the last clip and tighten the open\"\n />\n <Pressable\n onPress={() => void run()}\n disabled={busy}\n style={({ pressed }) => [styles.cta, busy && styles.ctaOff, pressedStyle(pressed)]}\n >\n {busy ? <ActivityIndicator color={theme.edOnInk} /> : <Text style={styles.ctaLabel}>Run cut</Text>}\n </Pressable>\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { padding: SPACE.lg, gap: SPACE.sm },\n title: { ...TYPE.title, color: theme.edInk },\n fine: { ...TYPE.caption, fontWeight: '400', color: theme.edInk3 },\n log: { maxHeight: 140, backgroundColor: theme.edRaised, borderRadius: RADIUS.md, padding: SPACE.md },\n logInner: { paddingBottom: SPACE.sm },\n logLine: { ...TYPE.caption, fontWeight: '400', color: theme.edInk2, marginBottom: SPACE.xs },\n status: { ...TYPE.caption, color: theme.edAccent },\n input: {\n minHeight: 72,\n borderRadius: RADIUS.md,\n backgroundColor: theme.edRaised,\n paddingHorizontal: SPACE.md,\n paddingVertical: 10,\n fontSize: 14,\n color: theme.edInk,\n textAlignVertical: 'top',\n },\n cta: {\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 44,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.edAccent,\n },\n ctaOff: { opacity: 0.5 },\n ctaLabel: { ...TYPE.label, fontSize: 14, color: theme.edOnInk },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentCutPane.js","sources":["../../../../../src/features/canvas/videoEditor/agent/AgentCutPane.tsx"],"sourcesContent":["/**\n * Agentic cut pane inside the video editor: describe the cut, tools rearrange clips.\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport type { EditorTimeline } from '../editorModel';\nimport type { RunMediaAction } from '../mediaActions';\nimport { deriveAgentEndpoint } from '../remoteMediaClient';\nimport { reflowSceneChildren } from '../sceneLayers';\nimport { runCutAgentTurn } from './agentLoop';\nimport type { MediaAnalysis } from './cutTools';\nimport {\n fetchLinkViaAgent,\n importLink,\n intakeLinks,\n linksIn,\n type AgentAttachment,\n type LinkMediaKind,\n} from './attachments';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../../canvasTheme';\nimport { Pressable, RADIUS, SPACE, TYPE, pressedStyle } from '../../canvasUi';\n\nexport function AgentCutPane({\n timeline,\n setTimeline,\n token,\n indexUrl,\n runAction,\n uploadMedia,\n onAddMedia,\n onFilm,\n library,\n sourceSec,\n}: {\n timeline: EditorTimeline;\n setTimeline: (next: EditorTimeline | ((prev: EditorTimeline) => EditorTimeline)) => void;\n token?: string | null;\n indexUrl?: string | null;\n /** Pasted links are fetched through the storage connector with this runner. */\n runAction?: RunMediaAction;\n /** Stores a fetched link's bytes (data: URL) and returns the hosted URL. */\n uploadMedia?: (localUri: string) => Promise<string>;\n /** Put a taken-in link into the editor library; returns its id. */\n onAddMedia?: (asset: { type: LinkMediaKind; src: string; name: string }) => string;\n /** film_scenes: film these colour scenes in the background. */\n onFilm?: (sceneIds: string[]) => void;\n /** Media the agent may cut from (board + picked + taken-in links). */\n library?: ReadonlyArray<{ id: string; type: string; src: string; generatedAssetName?: string }>;\n /** Known source seconds per clip id. */\n sourceSec?: Readonly<Record<string, number>>;\n}) {\n const theme = useCanvasTheme();\n const styles = useMemo(() => makeStyles(theme), [theme]);\n const timelineRef = useRef(timeline);\n timelineRef.current = timeline;\n const libraryRef = useRef(library);\n libraryRef.current = library;\n const sourceSecRef = useRef(sourceSec);\n sourceSecRef.current = sourceSec;\n /** Analyses survive across turns: a re-ask never re-transcribes. */\n const analysesRef = useRef(new Map<string, MediaAnalysis>());\n const [prompt, setPrompt] = useState('Keep the strongest 3 clips and put the hero shot first');\n const [busy, setBusy] = useState(false);\n const [status, setStatus] = useState<string | null>(null);\n const [log, setLog] = useState<string[]>([]);\n const [history, setHistory] = useState<Array<{ role: 'user' | 'assistant'; content: string }>>([]);\n\n const run = async () => {\n if (!token || !indexUrl) {\n setLog((l) => [...l, 'Sign in needed for AI cut.']);\n return;\n }\n const text = prompt.trim();\n if (!text || busy) return;\n setBusy(true);\n setStatus('Starting…');\n setHistory((h) => [...h, { role: 'user', content: text }]);\n try {\n // Pasted links become library media the model is told about (pictures it sees).\n let attachments: AgentAttachment[] = [];\n const links = linksIn(text);\n if (links.length && runAction && uploadMedia && onAddMedia) {\n setStatus(`Taking in ${links.length} link${links.length === 1 ? '' : 's'}…`);\n attachments = await intakeLinks(links, {\n fetchUrl: (url, accept) => fetchLinkViaAgent(runAction, url, accept),\n upload: (dataUrl) => uploadMedia(dataUrl),\n addAsset: (asset) => onAddMedia(asset),\n });\n for (const a of attachments) {\n setLog((l) => [\n ...l,\n a.kind === 'unusable' ? `Could not take in ${a.name}: ${a.reason}` : `Took in ${a.name}`,\n ]);\n }\n }\n const result = await runCutAgentTurn({\n history,\n userText: text,\n attachments,\n token,\n agentEndpoint: deriveAgentEndpoint(indexUrl),\n onStatus: setStatus,\n ctx: {\n getTimeline: () => timelineRef.current,\n // Scene-scoped layers move with their scenes on agent edits too.\n setTimeline: (next) => {\n const reflowed = reflowSceneChildren(timelineRef.current, next);\n timelineRef.current = reflowed;\n setTimeline(reflowed);\n },\n ...(onFilm ? { film: onFilm } : {}),\n ...(runAction ? { runAction } : {}),\n analyses: analysesRef.current,\n progress: setStatus,\n sourceSec: () => sourceSecRef.current ?? {},\n library: () =>\n (libraryRef.current ?? []).flatMap((i) =>\n i.type === 'image' || i.type === 'video' || i.type === 'audio'\n ? [{ id: i.id, type: i.type, src: i.src, name: i.generatedAssetName || i.type }]\n : [],\n ),\n ...(runAction && uploadMedia && onAddMedia\n ? {\n importLink: async (url: string) => {\n const got = await importLink(url, {\n fetchUrl: (u, accept) => fetchLinkViaAgent(runAction, u, accept),\n upload: (dataUrl) => uploadMedia(dataUrl),\n });\n const id = onAddMedia({ type: got.kind, src: got.src, name: got.name });\n return { id, type: got.kind, src: got.src, name: got.name, sourceUrl: url };\n },\n }\n : {}),\n },\n });\n for (const step of result.steps) setLog((l) => [...l, step.label]);\n setLog((l) => [...l, result.text]);\n setHistory((h) => [...h, { role: 'assistant', content: result.text }]);\n setPrompt('');\n } catch (err: unknown) {\n setLog((l) => [...l, err instanceof Error ? err.message : String(err)]);\n } finally {\n setBusy(false);\n setStatus(null);\n }\n };\n\n return (\n <View style={styles.root}>\n <Text style={styles.title}>AI cut</Text>\n <Text style={styles.fine}>\n Describe the cut. The agent can read the dialogue, lay a whole cut, trim, reorder and remove clips, add\n scenes to film, titles, music, sound effects, voiceover and captions, and take in pasted links.\n </Text>\n <ScrollView style={styles.log} contentContainerStyle={styles.logInner}>\n {log.map((line, i) => (\n <Text key={`${i}-${line.slice(0, 12)}`} style={styles.logLine}>\n {line}\n </Text>\n ))}\n </ScrollView>\n {status ? <Text style={styles.status}>{status}</Text> : null}\n <TextInput\n value={prompt}\n onChangeText={setPrompt}\n style={styles.input}\n multiline\n placeholderTextColor={theme.edInk3}\n placeholder=\"e.g. Drop the last clip and tighten the open\"\n />\n <Pressable\n onPress={() => void run()}\n disabled={busy}\n style={({ pressed }) => [styles.cta, busy && styles.ctaOff, pressedStyle(pressed)]}\n >\n {busy ? <ActivityIndicator color={theme.edOnInk} /> : <Text style={styles.ctaLabel}>Run cut</Text>}\n </Pressable>\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { padding: SPACE.lg, gap: SPACE.sm },\n title: { ...TYPE.title, color: theme.edInk },\n fine: { ...TYPE.caption, fontWeight: '400', color: theme.edInk3 },\n log: { maxHeight: 140, backgroundColor: theme.edRaised, borderRadius: RADIUS.md, padding: SPACE.md },\n logInner: { paddingBottom: SPACE.sm },\n logLine: { ...TYPE.caption, fontWeight: '400', color: theme.edInk2, marginBottom: SPACE.xs },\n status: { ...TYPE.caption, color: theme.edAccent },\n input: {\n minHeight: 72,\n borderRadius: RADIUS.md,\n backgroundColor: theme.edRaised,\n paddingHorizontal: SPACE.md,\n paddingVertical: 10,\n fontSize: 14,\n color: theme.edInk,\n textAlignVertical: 'top',\n },\n cta: {\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 44,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.edAccent,\n },\n ctaOff: { opacity: 0.5 },\n ctaLabel: { ...TYPE.label, fontSize: 14, color: theme.edOnInk },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {brainChat}from'./brainClient.js';import {CUT_AGENT_TOOLS,executeCutTool}from'./cutTools.js';import {userContent}from'./attachments.js';const SYSTEM = `You are a video editor assistant on a phone timeline.
|
|
2
2
|
Use tools to inspect and rearrange clips. Prefer short clear replies.
|
|
3
3
|
When the user wants scenes the cut does not have, add_scene one shot per beat (picture only, 4-8s each), lay titles with add_text, then call film_scenes once - the footage lands in place in a few minutes; do not wait for it.
|
|
4
|
+
Before cutting footage you have not seen, analyze_footage it; find lines with search_dialogue and get_transcript, and lay a whole cut at once with set_cut.
|
|
5
|
+
Sound: add_music for a bed under the cut, add_sound_effect for a hit at a second, add_voiceover for a spoken line, add_captions for subtitles from the dialogue. set_format changes the frame.
|
|
4
6
|
Pictures attached to a message are shown to you; the [Attached with this message] block names the library id each became.
|
|
5
7
|
Only use the provided tools. When done, summarize in two sentences.`;
|
|
6
8
|
async function runCutAgentTurn(args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentLoop.js","sources":["../../../../../src/features/canvas/videoEditor/agent/agentLoop.ts"],"sourcesContent":["/**\n * One agentic cut turn — twin of web agentLoop (cut tools only).\n */\nimport { brainChat, type BrainMessage, type BrainReply } from './brainClient';\nimport { CUT_AGENT_TOOLS, executeCutTool, type AgentToolContext } from './cutTools';\nimport { userContent, type AgentAttachment } from './attachments';\n\nexport interface AgentTurnResult {\n text: string;\n steps: Array<{ label: string; detail?: string }>;\n}\n\nconst SYSTEM = `You are a video editor assistant on a phone timeline.\nUse tools to inspect and rearrange clips. Prefer short clear replies.\nWhen the user wants scenes the cut does not have, add_scene one shot per beat (picture only, 4-8s each), lay titles with add_text, then call film_scenes once - the footage lands in place in a few minutes; do not wait for it.\nPictures attached to a message are shown to you; the [Attached with this message] block names the library id each became.\nOnly use the provided tools. When done, summarize in two sentences.`;\n\nexport async function runCutAgentTurn(args: {\n history: Array<{ role: 'user' | 'assistant'; content: string }>;\n userText: string;\n /** Files/links taken in with this message: named in a block, pictures sent as image parts. */\n attachments?: AgentAttachment[];\n ctx: AgentToolContext;\n token: string;\n agentEndpoint: string;\n onStatus?: (text: string) => void;\n maxRounds?: number;\n}): Promise<AgentTurnResult> {\n const steps: AgentTurnResult['steps'] = [];\n const messages: BrainMessage[] = [\n { role: 'system', content: SYSTEM },\n ...args.history.slice(-10).map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content })),\n { role: 'user', content: userContent(args.userText, args.attachments) },\n ];\n const maxRounds = args.maxRounds ?? 10;\n\n for (let round = 0; round < maxRounds; round += 1) {\n args.onStatus?.(round === 0 ? 'Thinking…' : `Working (round ${round + 1})…`);\n let reply: BrainReply;\n try {\n reply = await brainChat({\n messages,\n tools: CUT_AGENT_TOOLS,\n token: args.token,\n agentEndpoint: args.agentEndpoint,\n });\n } catch (err) {\n return {\n text: err instanceof Error ? err.message : String(err),\n steps,\n };\n }\n\n if (!reply.tool_calls?.length) {\n return { text: reply.content.trim() || 'Done.', steps };\n }\n\n messages.push({\n role: 'assistant',\n content: reply.content || '',\n });\n\n for (const call of reply.tool_calls) {\n let parsed: unknown = {};\n try {\n parsed = JSON.parse(call.function.arguments || '{}');\n } catch {\n parsed = {};\n }\n args.onStatus?.(call.function.name);\n const outcome = await executeCutTool(call.function.name, parsed, args.ctx);\n steps.push({ label: outcome.label, detail: outcome.detail });\n messages.push({\n role: 'tool',\n tool_call_id: call.id,\n name: call.function.name,\n content: outcome.content,\n });\n }\n }\n\n return { text: 'Stopped after the tool budget. Ask me to continue if needed.', steps };\n}\n"],"names":[],"mappings":"+IAaA,MAAM,MAAS,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA,mEAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"agentLoop.js","sources":["../../../../../src/features/canvas/videoEditor/agent/agentLoop.ts"],"sourcesContent":["/**\n * One agentic cut turn — twin of web agentLoop (cut tools only).\n */\nimport { brainChat, type BrainMessage, type BrainReply } from './brainClient';\nimport { CUT_AGENT_TOOLS, executeCutTool, type AgentToolContext } from './cutTools';\nimport { userContent, type AgentAttachment } from './attachments';\n\nexport interface AgentTurnResult {\n text: string;\n steps: Array<{ label: string; detail?: string }>;\n}\n\nconst SYSTEM = `You are a video editor assistant on a phone timeline.\nUse tools to inspect and rearrange clips. Prefer short clear replies.\nWhen the user wants scenes the cut does not have, add_scene one shot per beat (picture only, 4-8s each), lay titles with add_text, then call film_scenes once - the footage lands in place in a few minutes; do not wait for it.\nBefore cutting footage you have not seen, analyze_footage it; find lines with search_dialogue and get_transcript, and lay a whole cut at once with set_cut.\nSound: add_music for a bed under the cut, add_sound_effect for a hit at a second, add_voiceover for a spoken line, add_captions for subtitles from the dialogue. set_format changes the frame.\nPictures attached to a message are shown to you; the [Attached with this message] block names the library id each became.\nOnly use the provided tools. When done, summarize in two sentences.`;\n\nexport async function runCutAgentTurn(args: {\n history: Array<{ role: 'user' | 'assistant'; content: string }>;\n userText: string;\n /** Files/links taken in with this message: named in a block, pictures sent as image parts. */\n attachments?: AgentAttachment[];\n ctx: AgentToolContext;\n token: string;\n agentEndpoint: string;\n onStatus?: (text: string) => void;\n maxRounds?: number;\n}): Promise<AgentTurnResult> {\n const steps: AgentTurnResult['steps'] = [];\n const messages: BrainMessage[] = [\n { role: 'system', content: SYSTEM },\n ...args.history.slice(-10).map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content })),\n { role: 'user', content: userContent(args.userText, args.attachments) },\n ];\n const maxRounds = args.maxRounds ?? 10;\n\n for (let round = 0; round < maxRounds; round += 1) {\n args.onStatus?.(round === 0 ? 'Thinking…' : `Working (round ${round + 1})…`);\n let reply: BrainReply;\n try {\n reply = await brainChat({\n messages,\n tools: CUT_AGENT_TOOLS,\n token: args.token,\n agentEndpoint: args.agentEndpoint,\n });\n } catch (err) {\n return {\n text: err instanceof Error ? err.message : String(err),\n steps,\n };\n }\n\n if (!reply.tool_calls?.length) {\n return { text: reply.content.trim() || 'Done.', steps };\n }\n\n messages.push({\n role: 'assistant',\n content: reply.content || '',\n });\n\n for (const call of reply.tool_calls) {\n let parsed: unknown = {};\n try {\n parsed = JSON.parse(call.function.arguments || '{}');\n } catch {\n parsed = {};\n }\n args.onStatus?.(call.function.name);\n const outcome = await executeCutTool(call.function.name, parsed, args.ctx);\n steps.push({ label: outcome.label, detail: outcome.detail });\n messages.push({\n role: 'tool',\n tool_call_id: call.id,\n name: call.function.name,\n content: outcome.content,\n });\n }\n }\n\n return { text: 'Stopped after the tool budget. Ask me to continue if needed.', steps };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -14,33 +14,103 @@ var __spreadValues = (a, b) => {
|
|
|
14
14
|
}
|
|
15
15
|
return a;
|
|
16
16
|
};
|
|
17
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
17
18
|
const BRAIN_SMART_MODEL = "yantra-brain/smart";
|
|
18
|
-
|
|
19
|
+
const BRAIN_SIGN_IN_MESSAGE = "Sign in to use the agent.";
|
|
20
|
+
const BRAIN_SIGN_IN_CODE = "SIGN_IN_REQUIRED";
|
|
21
|
+
class BrainSignInRequiredError extends Error {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(BRAIN_SIGN_IN_MESSAGE);
|
|
24
|
+
__publicField(this, "code", BRAIN_SIGN_IN_CODE);
|
|
25
|
+
this.name = "BrainSignInRequiredError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function errorCode(json) {
|
|
29
|
+
const error = json.error;
|
|
30
|
+
if (typeof json.code === "string") return json.code;
|
|
31
|
+
if (error && typeof error === "object" && typeof error.code === "string") {
|
|
32
|
+
return error.code;
|
|
33
|
+
}
|
|
34
|
+
return typeof error === "string" ? error : "";
|
|
35
|
+
}
|
|
36
|
+
function errorMessage(json, status) {
|
|
37
|
+
const error = json.error;
|
|
38
|
+
if (typeof error === "string" && error) return error;
|
|
39
|
+
if (error && typeof error === "object" && typeof error.message === "string") {
|
|
40
|
+
return error.message;
|
|
41
|
+
}
|
|
42
|
+
if (typeof json.message === "string" && json.message) return json.message;
|
|
43
|
+
return `Brain chat failed (HTTP ${status})`;
|
|
44
|
+
}
|
|
45
|
+
const BRAIN_RETRY_STATUSES = /* @__PURE__ */ new Set([429, 502, 503, 504]);
|
|
46
|
+
const BRAIN_RETRY_DELAYS_MS = [3e3, 8e3, 15e3];
|
|
47
|
+
const BRAIN_RETRY_ATTEMPTS = 3;
|
|
48
|
+
function brainRetryDelay(attempt, failure, options = {}) {
|
|
19
49
|
var _a, _b, _c;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
50
|
+
if (attempt >= ((_a = options.attempts) != null ? _a : BRAIN_RETRY_ATTEMPTS)) return null;
|
|
51
|
+
const retryable = "networkError" in failure || BRAIN_RETRY_STATUSES.has(failure.status);
|
|
52
|
+
if (!retryable) return null;
|
|
53
|
+
const delays = ((_b = options.delaysMs) == null ? void 0 : _b.length) ? options.delaysMs : BRAIN_RETRY_DELAYS_MS;
|
|
54
|
+
return (_c = delays[Math.min(attempt, delays.length - 1)]) != null ? _c : 0;
|
|
55
|
+
}
|
|
56
|
+
const pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
57
|
+
async function brainChat(args) {
|
|
58
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
59
|
+
if (!((_a = args.token) == null ? void 0 : _a.trim())) throw new BrainSignInRequiredError();
|
|
60
|
+
const body = JSON.stringify(__spreadValues({
|
|
61
|
+
model: args.model || BRAIN_SMART_MODEL,
|
|
62
|
+
messages: args.messages
|
|
63
|
+
}, ((_b = args.tools) == null ? void 0 : _b.length) ? {
|
|
64
|
+
tools: args.tools,
|
|
65
|
+
tool_choice: "auto"
|
|
66
|
+
} : {}));
|
|
67
|
+
const sleep = (_d = (_c = args.retry) == null ? void 0 : _c.sleep) != null ? _d : pause;
|
|
68
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
69
|
+
let resp;
|
|
70
|
+
try {
|
|
71
|
+
resp = await fetch(`${args.agentEndpoint}/v1/yantra-brain/chat/completions`, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"content-type": "application/json",
|
|
75
|
+
authorization: `Bearer ${args.token}`
|
|
76
|
+
},
|
|
77
|
+
body
|
|
78
|
+
});
|
|
79
|
+
} catch (err) {
|
|
80
|
+
const delayMs = brainRetryDelay(attempt, {
|
|
81
|
+
networkError: true
|
|
82
|
+
}, args.retry);
|
|
83
|
+
if (delayMs === null) throw err;
|
|
84
|
+
(_f = (_e = args.retry) == null ? void 0 : _e.onRetry) == null ? void 0 : _f.call(_e, {
|
|
85
|
+
attempt: attempt + 1,
|
|
86
|
+
delayMs,
|
|
87
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
88
|
+
});
|
|
89
|
+
await sleep(delayMs);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const json = await resp.json().catch(() => ({}));
|
|
93
|
+
if (resp.status === 401 || errorCode(json) === BRAIN_SIGN_IN_CODE) throw new BrainSignInRequiredError();
|
|
94
|
+
if (!resp.ok) {
|
|
95
|
+
const delayMs = brainRetryDelay(attempt, {
|
|
96
|
+
status: resp.status
|
|
97
|
+
}, args.retry);
|
|
98
|
+
if (delayMs === null) throw new Error(errorMessage(json, resp.status));
|
|
99
|
+
(_h = (_g = args.retry) == null ? void 0 : _g.onRetry) == null ? void 0 : _h.call(_g, {
|
|
100
|
+
attempt: attempt + 1,
|
|
101
|
+
delayMs,
|
|
102
|
+
reason: `HTTP ${resp.status}`
|
|
103
|
+
});
|
|
104
|
+
await sleep(delayMs);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const choices = json.choices;
|
|
108
|
+
const message = (_j = (_i = choices == null ? void 0 : choices[0]) == null ? void 0 : _i.message) != null ? _j : {};
|
|
109
|
+
const content = typeof message.content === "string" ? message.content : "";
|
|
110
|
+
const tool_calls = Array.isArray(message.tool_calls) ? message.tool_calls : void 0;
|
|
111
|
+
return {
|
|
112
|
+
content,
|
|
113
|
+
tool_calls
|
|
114
|
+
};
|
|
37
115
|
}
|
|
38
|
-
|
|
39
|
-
const message = (_c = (_b = choices == null ? void 0 : choices[0]) == null ? void 0 : _b.message) != null ? _c : {};
|
|
40
|
-
const content = typeof message.content === "string" ? message.content : "";
|
|
41
|
-
const tool_calls = Array.isArray(message.tool_calls) ? message.tool_calls : void 0;
|
|
42
|
-
return {
|
|
43
|
-
content,
|
|
44
|
-
tool_calls
|
|
45
|
-
};
|
|
46
|
-
}export{BRAIN_SMART_MODEL,brainChat};//# sourceMappingURL=brainClient.js.map
|
|
116
|
+
}export{BRAIN_RETRY_ATTEMPTS,BRAIN_RETRY_DELAYS_MS,BRAIN_RETRY_STATUSES,BRAIN_SIGN_IN_CODE,BRAIN_SIGN_IN_MESSAGE,BRAIN_SMART_MODEL,BrainSignInRequiredError,brainChat,brainRetryDelay};//# sourceMappingURL=brainClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainClient.js","sources":["../../../../../src/features/canvas/videoEditor/agent/brainClient.ts"],"sourcesContent":["/** Brain chat transport for the studio agent (gateway /v1/yantra-brain). */\n\n/** Gateway tier alias (web `editors/shared/brainClient.ts`); resolves server-side. */\nexport const BRAIN_SMART_MODEL = 'yantra-brain/smart';\n/** OpenAI-style multimodal part: a user message can carry pictures as `image_url` parts. */\nexport type BrainContentPart = { type: 'text'; text: string } | { type: 'image_url'; image_url: { url: string } };\n\nexport interface BrainMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n /** Plain text, or (user turns) text + image parts. */\n content: string | BrainContentPart[];\n tool_call_id?: string;\n name?: string;\n}\n\n/** The text of a message, whichever shape its content has. */\nexport function messageText(content: BrainMessage['content']): string {\n if (typeof content === 'string') return content;\n return content\n .filter((p): p is Extract<BrainContentPart, { type: 'text' }> => p.type === 'text')\n .map((p) => p.text)\n .join('\\n');\n}\n\nexport interface BrainTool {\n type: 'function';\n function: { name: string; description: string; parameters: Record<string, unknown> };\n}\n\nexport interface BrainToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface BrainReply {\n content: string;\n tool_calls?: BrainToolCall[];\n}\n\nexport type BrainChat = (args: {\n messages: BrainMessage[];\n tools?: BrainTool[];\n model?: string;\n token: string;\n agentEndpoint: string;\n}) => Promise<BrainReply>;\n\nexport async function brainChat(args: {\n messages: BrainMessage[];\n tools?: BrainTool[];\n model?: string;\n token: string;\n agentEndpoint: string;\n}): Promise<BrainReply> {\n const resp = await fetch(`${args.agentEndpoint}/v1/yantra-brain/chat/completions`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${args.token}`,\n },\n body: JSON.stringify({\n model: args.model || BRAIN_SMART_MODEL,\n messages: args.messages,\n ...(args.tools?.length ? { tools: args.tools, tool_choice: 'auto' } : {}),\n }),\n });\n const json = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n if (!resp.ok) {\n throw new Error(typeof json.error === 'string' ? json.error : `Brain chat failed (HTTP ${resp.status})`);\n }\n const choices = json.choices as Array<{ message?: Record<string, unknown> }> | undefined;\n const message = choices?.[0]?.message ?? {};\n const content = typeof message.content === 'string' ? message.content : '';\n const tool_calls = Array.isArray(message.tool_calls) ? (message.tool_calls as BrainToolCall[]) : undefined;\n return { content, tool_calls };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGO,MAAM,iBAAoB,GAAA;AAqDjC,eAAsB,UAAU,IAMR,EAAA;AA9DxB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA+DE,EAAA,MAAM,OAAO,MAAM,KAAA,CAAM,CAAG,EAAA,IAAA,CAAK,aAAa,CAAqC,iCAAA,CAAA,EAAA;AAAA,IACjF,MAAQ,EAAA,MAAA;AAAA,IACR,OAAS,EAAA;AAAA,MACP,cAAgB,EAAA,kBAAA;AAAA,MAChB,aAAA,EAAe,CAAU,OAAA,EAAA,IAAA,CAAK,KAAK,CAAA;AAAA,KACrC;AAAA,IACA,IAAA,EAAM,KAAK,SAAU,CAAA,cAAA,CAAA;AAAA,MACnB,KAAA,EAAO,KAAK,KAAS,IAAA,iBAAA;AAAA,MACrB,UAAU,IAAK,CAAA;AAAA,KACX,EAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAY,MAAS,IAAA;AAAA,MACvB,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,WAAa,EAAA;AAAA,KACf,GAAI,EACL,CAAA;AAAA,GACF,CAAA;AACD,EAAM,MAAA,IAAA,GAAQ,MAAM,IAAK,CAAA,IAAA,GAAO,KAAM,CAAA,OAAO,EAAG,CAAA,CAAA;AAChD,EAAI,IAAA,CAAC,KAAK,EAAI,EAAA;AACZ,IAAM,MAAA,IAAI,KAAM,CAAA,OAAO,IAAK,CAAA,KAAA,KAAU,QAAW,GAAA,IAAA,CAAK,KAAQ,GAAA,CAAA,wBAAA,EAA2B,IAAK,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA;AAAA;AAEzG,EAAA,MAAM,UAAU,IAAK,CAAA,OAAA;AAGrB,EAAA,MAAM,WAAU,EAAU,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,CAAA,CAAA,KAAV,IAAc,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,KAAd,YAAyB,EAAC;AAC1C,EAAA,MAAM,UAAU,OAAO,OAAA,CAAQ,OAAY,KAAA,QAAA,GAAW,QAAQ,OAAU,GAAA,EAAA;AACxE,EAAA,MAAM,aAAa,KAAM,CAAA,OAAA,CAAQ,QAAQ,UAAU,CAAA,GAAI,QAAQ,UAAgC,GAAA,MAAA;AAC/F,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA;AAAA,GACF;AACF"}
|
|
1
|
+
{"version":3,"file":"brainClient.js","sources":["../../../../../src/features/canvas/videoEditor/agent/brainClient.ts"],"sourcesContent":["/** Brain chat transport for the studio agent (gateway /v1/yantra-brain). */\n\n/** Gateway tier alias (web `editors/shared/brainClient.ts`); resolves server-side. */\nexport const BRAIN_SMART_MODEL = 'yantra-brain/smart';\n/** OpenAI-style multimodal part: a user message can carry pictures as `image_url` parts. */\nexport type BrainContentPart = { type: 'text'; text: string } | { type: 'image_url'; image_url: { url: string } };\n\nexport interface BrainMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n /** Plain text, or (user turns) text + image parts. */\n content: string | BrainContentPart[];\n tool_call_id?: string;\n name?: string;\n}\n\n/** The text of a message, whichever shape its content has. */\nexport function messageText(content: BrainMessage['content']): string {\n if (typeof content === 'string') return content;\n return content\n .filter((p): p is Extract<BrainContentPart, { type: 'text' }> => p.type === 'text')\n .map((p) => p.text)\n .join('\\n');\n}\n\nexport interface BrainTool {\n type: 'function';\n function: { name: string; description: string; parameters: Record<string, unknown> };\n}\n\nexport interface BrainToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface BrainReply {\n content: string;\n tool_calls?: BrainToolCall[];\n}\n\nexport type BrainChat = (args: {\n messages: BrainMessage[];\n tools?: BrainTool[];\n model?: string;\n token: string;\n agentEndpoint: string;\n}) => Promise<BrainReply>;\n\n/**\n * What a person is told when the brain needs a sign-in. The app's brain proxies\n * answer 401 SIGN_IN_REQUIRED without a bearer (surface-kit 0.44), so a call with\n * no token is never sent and a 401 reads as this.\n */\nexport const BRAIN_SIGN_IN_MESSAGE = 'Sign in to use the agent.';\nexport const BRAIN_SIGN_IN_CODE = 'SIGN_IN_REQUIRED';\n\n/** An error a brain call failed with because no one is signed in. */\nexport class BrainSignInRequiredError extends Error {\n readonly code = BRAIN_SIGN_IN_CODE;\n constructor() {\n super(BRAIN_SIGN_IN_MESSAGE);\n this.name = 'BrainSignInRequiredError';\n }\n}\n\n/** The error code a brain answer carries (`{error:'SIGN_IN_REQUIRED'}`, `{code}`, `{error:{code}}`). */\nfunction errorCode(json: Record<string, unknown>): string {\n const error = json.error;\n if (typeof json.code === 'string') return json.code;\n if (error && typeof error === 'object' && typeof (error as Record<string, unknown>).code === 'string') {\n return (error as Record<string, unknown>).code as string;\n }\n return typeof error === 'string' ? error : '';\n}\n\nfunction errorMessage(json: Record<string, unknown>, status: number): string {\n const error = json.error;\n if (typeof error === 'string' && error) return error;\n if (error && typeof error === 'object' && typeof (error as Record<string, unknown>).message === 'string') {\n return (error as Record<string, unknown>).message as string;\n }\n if (typeof json.message === 'string' && json.message) return json.message;\n return `Brain chat failed (HTTP ${status})`;\n}\n\n// ── Resend on a passing outage (surface-kit agentChat 87ba3416) ─────────────\n\n/** Statuses that mean the gateway never answered the request: resending is safe. */\nexport const BRAIN_RETRY_STATUSES: ReadonlySet<number> = new Set([429, 502, 503, 504]);\n/** Wait before each resend (the kit's DEFAULT_RETRY_DELAYS_MS); the last repeats. */\nexport const BRAIN_RETRY_DELAYS_MS = [3000, 8000, 15000];\n/** Resends after the first attempt. */\nexport const BRAIN_RETRY_ATTEMPTS = 3;\n\nexport interface BrainRetryOptions {\n /** Resends after the first attempt (default {@link BRAIN_RETRY_ATTEMPTS}; 0 = never). */\n attempts?: number;\n delaysMs?: number[];\n sleep?: (ms: number) => Promise<void>;\n /** Told before each resend (for a \"Reconnecting…\" line). */\n onRetry?: (info: { attempt: number; delayMs: number; reason: string }) => void;\n}\n\n/** One failed attempt as the retry rule sees it: a status, or a fetch that threw. */\nexport type BrainFailure = { status: number } | { networkError: true };\n\n/**\n * How long to wait before resending, or null to give up. Pure. Only a request\n * the gateway never answered is resent - a fetch failure or 429/502/503/504;\n * a sign-in refusal or a real error answer is final.\n */\nexport function brainRetryDelay(\n attempt: number,\n failure: BrainFailure,\n options: BrainRetryOptions = {},\n): number | null {\n if (attempt >= (options.attempts ?? BRAIN_RETRY_ATTEMPTS)) return null;\n const retryable = 'networkError' in failure || BRAIN_RETRY_STATUSES.has(failure.status);\n if (!retryable) return null;\n const delays = options.delaysMs?.length ? options.delaysMs : BRAIN_RETRY_DELAYS_MS;\n return delays[Math.min(attempt, delays.length - 1)] ?? 0;\n}\n\nconst pause = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nexport async function brainChat(args: {\n messages: BrainMessage[];\n tools?: BrainTool[];\n model?: string;\n token: string;\n agentEndpoint: string;\n /** Resend policy for a passing outage; defaults to the kit's (3 resends, 3s/8s/15s). */\n retry?: BrainRetryOptions;\n}): Promise<BrainReply> {\n if (!args.token?.trim()) throw new BrainSignInRequiredError();\n const body = JSON.stringify({\n model: args.model || BRAIN_SMART_MODEL,\n messages: args.messages,\n ...(args.tools?.length ? { tools: args.tools, tool_choice: 'auto' } : {}),\n });\n const sleep = args.retry?.sleep ?? pause;\n for (let attempt = 0; ; attempt += 1) {\n let resp: Response;\n try {\n resp = await fetch(`${args.agentEndpoint}/v1/yantra-brain/chat/completions`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${args.token}`,\n },\n body,\n });\n } catch (err) {\n const delayMs = brainRetryDelay(attempt, { networkError: true }, args.retry);\n if (delayMs === null) throw err;\n args.retry?.onRetry?.({\n attempt: attempt + 1,\n delayMs,\n reason: err instanceof Error ? err.message : String(err),\n });\n await sleep(delayMs);\n continue;\n }\n const json = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n if (resp.status === 401 || errorCode(json) === BRAIN_SIGN_IN_CODE) throw new BrainSignInRequiredError();\n if (!resp.ok) {\n const delayMs = brainRetryDelay(attempt, { status: resp.status }, args.retry);\n if (delayMs === null) throw new Error(errorMessage(json, resp.status));\n args.retry?.onRetry?.({ attempt: attempt + 1, delayMs, reason: `HTTP ${resp.status}` });\n await sleep(delayMs);\n continue;\n }\n const choices = json.choices as Array<{ message?: Record<string, unknown> }> | undefined;\n const message = choices?.[0]?.message ?? {};\n const content = typeof message.content === 'string' ? message.content : '';\n const tool_calls = Array.isArray(message.tool_calls) ? (message.tool_calls as BrainToolCall[]) : undefined;\n return { content, tool_calls };\n }\n}\n"],"names":[],"mappings":"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"}
|