@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.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +4 -4
  359. package/lib/features/design/exportDesign.js +0 -133
  360. 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 {submitRenderTimeline,renderDeadline,RENDER_POLL_EVERY_MS,pollRenderTimeline,MAX_POLL_ERRORS}from'./renderTimeline.js';var __defProp = Object.defineProperty;
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 _a;
71
- if (((_a = getCanvasTask(id)) == null ? void 0 : _a.state) === "submitting") patchCanvasTask(id, {
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
- handle = await submitRenderTimeline(run, compiled);
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
- patchCanvasTask(id, __spreadValues({
132
+ const startedAt = deps.now();
133
+ patchCanvasTask(id, __spreadValues(__spreadValues({
111
134
  state: "running",
112
135
  render: handle,
113
- startedAt: deps.now(),
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":";;;;;;;;;;;;;;;;;;;AAwCA,eAAe,mBAAA,CAAoB,EAAY,EAAA,IAAA,EAAkB,UAAiE,EAAA;AAxClI,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAyCE,EAAA,MAAM,QAAW,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,YAAa,CAAA,EAAE,CAAC,CAAA,KAA5B,IAAkC,GAAA,EAAA,GAAA,MAAM,iBAAkB,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AACpG,EAAI,IAAA,CAAC,UAAiB,OAAA,IAAA;AACtB,EAAA,MAAM,SAAY,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,SAAL,KAAA,IAAA,GAAA,EAAA,GAAkB,IAAK,CAAA,SAAA;AACzC,EAAA,OAAO,kBAAkB,QAAU,EAAA;AAAA,IACjC,WAAa,EAAA,SAAA;AAAA,IACb,aAAY,EAAK,GAAA,IAAA,CAAA,UAAA,KAAL,YAAmB,cAAe,CAAA,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,IACpE;AAAA,GACD,CAAA;AACH;AACA,MAAM,WAA8B,GAAA;AAAA,EAClC,KAAA,EAAO,QAAM,IAAI,OAAA,CAAQ,OAAK,UAAW,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC/C,GAAA,EAAK,MAAM,IAAA,CAAK,GAAI,EAAA;AAAA,EACpB,aAAe,EAAA,gBAAA;AAAA,EACf,MAAQ,EAAA,iBAAA;AAAA,EACR,UAAY,EAAA;AACd,CAAA;AACA,IAAI,IAAO,GAAA,WAAA;AAqBX,MAAM,OAAA,uBAAc,GAA2B,EAAA;AAE/C,MAAM,OAAA,uBAAc,GAAY,EAAA;AAChC,IAAI,GAAM,GAAA,CAAA;AACV,MAAM,KAAQ,GAAA,MAAM,CAAU,OAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAE,QAAS,CAAA,EAAE,CAAC,CAAA,CAAA,EAAA,CAAK,GAAO,EAAA,EAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC7E,MAAM,WAAW,CAACA,KAAAA,KAA6BA,MAAK,IAAO,GAAA,CAAA,KAAA,EAAQA,MAAK,IAAK,CAAA,KAAK,OAAOA,KAAK,CAAA,IAAA,CAAK,KAAK,CAAMA,MAAAA,EAAAA,KAAAA,CAAK,KAAK,KAAK,CAAA,CAAA,GAAKA,MAAK,KAAS,IAAA,iBAAA;AAChJ,MAAM,SAAY,GAAA,CAAC,GAAc,EAAA,QAAA,KAAA,CAA8B,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAA,KAAQ,QAAW,GAAA,GAAA,GAAM,EAAO,KAAA,QAAA;AAC3I,MAAM,SAAS,CAAC,EAAA,EAAY,UAA+B,eAAgB,CAAA,EAAA,EAAI,iCAC1E,KAD0E,CAAA,EAAA;AAAA,EAE7E,OAAA,EAAS,KAAK,GAAI;AACpB,CAAC,CAAA,CAAA;AACD,SAAS,YAAA,CAAa,KAAa,IAA8C,EAAA;AAzFjF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA0FE,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA,EAAA,CAAO,6BAAM,KAAS,KAAA,cAAA;AAAA,IACtB,SAAA,EAAA,CAAW,8CAAM,MAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,UAAd,IAAuB,GAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAA7B,IAAmC,GAAA,EAAA,GAAA,EAAA;AAAA,IAC9C,MAAQ,EAAA,QAAA;AAAA,IACR,QAAA,EAAA,CAAU,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,IAAQ,cAAiB,GAAA;AAAA,GAC3C;AACF;AAOsB,eAAA,eAAA,CAAgB,KAAqB,KAA8C,EAAA;AACvG,EAAA,MAAM,kBAAmB,EAAA;AACzB,EAAA,MAAM,KAAK,KAAM,EAAA;AACjB,EAAc,aAAA,CAAA;AAAA,IACZ,EAAA;AAAA,IACA,IAAM,EAAA,QAAA;AAAA,IACN,KAAO,EAAA,cAAA;AAAA,IACP,OAAO,KAAM,CAAA,KAAA;AAAA,IACb,SAAS,KAAM,CAAA,OAAA;AAAA,IACf,KAAO,EAAA,YAAA;AAAA,IACP,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,IACpB,OAAS,EAAA;AAAA,MACP,QAAQ,KAAM,CAAA,KAAA;AAAA,MACd,MAAQ,EAAA,QAAA;AAAA,MACR,eAAiB,EAAA,CAAA;AAAA,MACjB,WAAa,EAAA;AAAA,KACf;AAAA,IACA,QAAU,EAAA;AAAA,GACX,CAAA;AACD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAK,KAAA,SAAA,CAAU,GAAK,EAAA,EAAA,EAAI,KAAK,CAAA,CAAE,QAAQ,MAAM,OAAA,CAAQ,MAAO,CAAA,EAAE,CAAC,CAAA;AAC/D,EAAO,OAAA,EAAA;AACT;AACA,eAAe,SAAA,CAAU,GAAqB,EAAA,EAAA,EAAY,KAA4C,EAAA;AA/HtG,EAAA,IAAA,EAAA;AAgIE,EAAM,MAAA,IAAA,GAAO,CAAC,QAAqB,KAAA;AAhIrC,IAAAC,IAAAA,GAAAA;AAiII,IAAIA,IAAAA,CAAAA,CAAAA,GAAAA,GAAA,cAAc,EAAE,CAAA,KAAhB,gBAAAA,GAAmB,CAAA,KAAA,MAAU,YAAc,EAAA,eAAA,CAAgB,EAAI,EAAA;AAAA,MACjE;AAAA,KACD,CAAA;AAAA,GACH;AACA,EAAI,IAAA,MAAA;AACJ,EAAA,IAAI,MAAS,GAAA,KAAA;AACb,EAAI,IAAA;AACF,IAAA,MAAM,QAAW,GAAA,MAAM,qBAAsB,CAAA,KAAA,CAAM,MAAM,GAAK,EAAA;AAAA,MAC5D,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,OAAS,EAAA,CAAA,GAAA,KAAO,uBAAwB,CAAA,GAAA,EAAK,GAAG,CAAA;AAAA,MAChD,UAAY,EAAA;AAAA,KACb,CAAA;AACD,IAAA,IAAI,QAAS,CAAA,QAAA,CAAS,MAAQ,EAAA,eAAA,CAAgB,EAAI,EAAA;AAAA,MAChD,UAAU,QAAS,CAAA;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,SAAS,KAAM,CAAA,MAAA,KAAW,KAAK,QAAS,CAAA,QAAA,CAAS,SAAS,KAAO,EAAA;AACnE,MAAA,MAAA,CAAO,EAAI,EAAA;AAAA,QACT,KAAO,EAAA,WAAA;AAAA,QACP,QAAQ,YAAa,CAAA,QAAA,CAAS,SAAS,GAAK,EAAA,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA,QAC7D,QAAU,EAAA;AAAA,OACX,CAAA;AACD,MAAA;AAAA;AAEF,IAAA,IAAA,CAAK,2BAAsB,CAAA;AAE3B,IAAM,MAAA,OAAA,GAAU,cAAc,EAAE,CAAA;AAChC,IAAA,MAAM,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAS,MAAM,OAAA,CAAQ,aAAc,CAAA,EAAE,CAAC,CAAC,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAI,GAAA,KAAA,CAAA;AAC5G,IAAI,IAAA;AACF,MAAA,MAAM,SAAY,GAAA,MAAM,2BAA4B,CAAA,GAAA,EAAK,UAAU,GAAM,GAAA;AAAA,QACvE;AAAA,OACF,GAAI,EAAE,CAAA;AACN,MAAA,MAAA,GAAS,SAAU,CAAA,MAAA;AACnB,MAAA,MAAA,GAAS,SAAU,CAAA,MAAA;AAAA,aACZ,GAAK,EAAA;AACZ,MAAI,IAAA,CAAC,aAAc,CAAA,EAAE,CAAG,EAAA;AACxB,MAAgB,eAAA,CAAA,YAAA,CAAa,EAAE,CAAC,CAAA;AAChC,MAAA,MAAM,aAAc,CAAA,GAAA,EAAK,EAAI,EAAA,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA;AAAA;AACF,WACO,GAAK,EAAA;AACZ,IAAA,MAAA,CAAO,EAAI,EAAA;AAAA,MACT,KAAO,EAAA,QAAA;AAAA,MACP,KAAA,EAAO,SAAU,CAAA,GAAA,EAAK,4BAA4B,CAAA;AAAA,MAClD,QAAU,EAAA;AAAA,KACX,CAAA;AACD,IAAA;AAAA;AAEF,EAAI,IAAA,CAAC,aAAc,CAAA,EAAE,CAAG,EAAA;AACxB,EAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA;AAC3B,EAAA,eAAA,CAAgB,EAAI,EAAA,cAAA,CAAA,cAAA,CAAA;AAAA,IAClB,KAAO,EAAA,SAAA;AAAA,IACP,MAAQ,EAAA,MAAA;AAAA,IACR,SAAA;AAAA;AAAA,IAEA,YAAY,aAAc,CAAA,SAAA,EAAA,CAAW,EAAO,GAAA,MAAA,CAAA,OAAA,KAAP,YAAkB,kBAAkB,CAAA;AAAA,IACzE,QAAU,EAAA;AAAA,GAAA,EACN,OAAO,MAAS,GAAA;AAAA,IAClB,QAAQ,MAAO,CAAA;AAAA,GACjB,GAAI,EAAC,CAAA,EACD,MAAS,GAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB,GAAI,EACL,CAAA,CAAA;AACD,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAChB;AAGA,eAAe,aAAc,CAAA,GAAA,EAAqB,EAAY,EAAA,KAAA,EAA6B,GAAc,EAAA;AACvG,EAAA,eAAA,CAAgB,EAAI,EAAA;AAAA,IAClB,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,IAAA;AAAA,IACP,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,IACpB,QAAU,EAAA;AAAA,GACX,CAAA;AACD,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,MAAM,IAAA,CAAK,aAAc,CAAA,KAAA,CAAM,IAAM,EAAA,GAAA,EAAK,KAAM,CAAA,MAAA,EAAQ,CAAK,CAAA,KAAA,eAAA,CAAgB,EAAI,EAAA;AAAA,MAC3F,UAAU,CAAE,CAAA;AAAA,KACb,CAAC,CAAA;AACF,IAAA,MAAA,CAAO,EAAI,EAAA;AAAA,MACT,KAAO,EAAA,WAAA;AAAA,MACP,MAAQ,EAAA,YAAA,CAAa,GAAK,EAAA,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA,MAC3C,QAAU,EAAA;AAAA,KACX,CAAA;AAAA,WACM,GAAK,EAAA;AACZ,IAAM,MAAA,WAAA,GAAc,SAAU,CAAA,GAAA,EAAK,EAAE,CAAA;AACrC,IAAA,MAAA,CAAO,EAAI,EAAA;AAAA,MACT,KAAO,EAAA,QAAA;AAAA,MACP,KAAA,EAAO,UAAU,GAAK,EAAA,mBAAmB,KAAK,WAAc,GAAA,CAAA,kBAAA,EAAqB,WAAW,CAAM,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,MAClG,QAAU,EAAA;AAAA,KACX,CAAA;AAAA;AAEL;AACA,SAAS,MAAA,CAAO,KAAqB,EAAY,EAAA;AAC/C,EAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,EAAE,CAAG,EAAA;AACrB,EAAM,MAAA,GAAA,GAAM,IAAK,CAAA,GAAA,EAAK,EAAE,CAAA,CAAE,QAAQ,MAAM,OAAA,CAAQ,MAAO,CAAA,EAAE,CAAC,CAAA;AAC1D,EAAQ,OAAA,CAAA,GAAA,CAAI,IAAI,GAAG,CAAA;AACrB;AAMA,eAAe,cAAc,EAA8B,EAAA;AAxO3D,EAAA,IAAA,EAAA;AAyOE,EAAM,MAAA,IAAA,GAAO,cAAc,EAAE,CAAA;AAC7B,EAAA,IAAI,EAAC,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,YAAA,CAAA,IAAgB,IAAK,CAAA,KAAA,KAAU,WAAkB,OAAA,KAAA;AAC5D,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA;AACF,IAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,CAAA,EAAA,EAAI,MAAM,CAAO,GAAA,KAAA;AA7OrD,MAAAA,IAAAA,GAAAA;AA8OM,MAAA,IAAA,CAAA,CAAIA,MAAA,aAAc,CAAA,EAAE,MAAhB,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAmB,WAAU,SAAW,EAAA;AAC5C,MAAM,MAAA,IAAA,GAAO,mBAAmB,GAAG,CAAA;AACnC,MAAgB,eAAA,CAAA,EAAA,EAAI,cACd,CAAA,cAAA,CAAA,EAAA,EAAA,GAAA,CAAI,KAAQ,GAAA;AAAA,QACd,IAAM,EAAA;AAAA,UACJ,KAAA,EAAO,IAAI,KAAM,CAAA,KAAA;AAAA,UACjB,KAAA,EAAO,IAAI,KAAM,CAAA,KAAA;AAAA,UACjB,KAAA,EAAO,IAAI,KAAM,CAAA;AAAA;AACnB,OACF,GAAI,EAAC,CAAA,EACD,IAAO,GAAA;AAAA,QACT,QAAU,EAAA;AAAA,OACZ,GAAI,EACL,CAAA,CAAA;AAAA,KACF,CAAA;AAAA,WACM,GAAK,EAAA;AACZ,IAAA,MAAA,CAAO,EAAI,EAAA;AAAA,MACT,KAAO,EAAA,QAAA;AAAA,MACP,KAAA,EAAO,SAAU,CAAA,GAAA,EAAK,+BAA+B,CAAA;AAAA,MACrD,QAAU,EAAA;AAAA,KACX,CAAA;AACD,IAAgB,eAAA,CAAA,YAAA,CAAa,EAAE,CAAC,CAAA;AAChC,IAAO,OAAA,IAAA;AAAA;AAET,EAAM,MAAA,OAAA,GAAU,cAAc,EAAE,CAAA;AAChC,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AACrB,EAAA,IAAI,CAAC,OAAS,EAAA;AAEZ,IAAA,eAAA,CAAgB,EAAI,EAAA;AAAA,MAClB,YAAc,EAAA;AAAA,KACf,CAAA;AACD,IAAO,OAAA,KAAA;AAAA;AAET,EAAI,IAAA,OAAA,CAAQ,KAAU,KAAA,SAAA,EAAkB,OAAA,IAAA;AACxC,EAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,KAAA,KAAU,WAAc,GAAA,oBAAA,CAAqB,OAAO,CAAK,KAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,MAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,SAAY,CAAA,GAAA,MAAA;AACzG,EAAA,MAAA,CAAO,IAAI,GAAM,GAAA;AAAA,IACf,KAAO,EAAA,WAAA;AAAA,IACP,MAAA,EAAQ,YAAa,CAAA,GAAA,EAAK,OAAO,CAAA;AAAA,IACjC,QAAU,EAAA,OAAA;AAAA,IACV,WAAW,OAAQ,CAAA;AAAA,GACjB,GAAA,cAAA,CAAA;AAAA,IACF,KAAO,EAAA,QAAA;AAAA,IACP,KAAA,EAAO,QAAQ,KAAS,IAAA,mBAAA;AAAA,IACxB,QAAU,EAAA;AAAA,GAAA,EACN,QAAQ,SAAY,GAAA;AAAA,IACtB,WAAW,OAAQ,CAAA;AAAA,GACrB,GAAI,EACL,CAAA,CAAA;AACD,EAAgB,eAAA,CAAA,YAAA,CAAa,EAAE,CAAC,CAAA;AAChC,EAAO,OAAA,IAAA;AACT;AAGA,eAAe,IAAA,CAAK,KAAqB,EAA2B,EAAA;AAnSpE,EAAA,IAAA,EAAA;AAoSE,EAAI,IAAA,MAAM,aAAc,CAAA,EAAE,CAAG,EAAA;AAC7B,EAAM,MAAA,KAAA,GAAQ,cAAc,EAAE,CAAA;AAC9B,EAAA,IAAI,EAAC,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,MAAU,CAAA,IAAA,KAAA,CAAM,UAAU,SAAW,EAAA;AACjD,EAAA,MAAM,SAAS,KAAM,CAAA,MAAA;AACrB,EAAA,MAAM,aAAa,cAAe,CAAA,CAAA,EAAA,GAAA,KAAA,CAAM,cAAN,IAAmB,GAAA,EAAA,GAAA,KAAA,CAAM,WAAW,MAAM,CAAA;AAC5E,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAO,OAAA,IAAA,CAAK,GAAI,EAAA,GAAI,UAAY,EAAA;AAC9B,IAAM,MAAA,IAAA,CAAK,MAAM,oBAAoB,CAAA;AACrC,IAAM,MAAA,OAAA,GAAU,cAAc,EAAE,CAAA;AAChC,IAAI,IAAA,CAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,WAAU,SAAW,EAAA;AAClC,IAAI,IAAA,MAAA;AACJ,IAAI,IAAA;AACF,MAAS,MAAA,GAAA,MAAM,kBAAmB,CAAA,GAAA,EAAK,MAAM,CAAA;AAC7C,MAAS,MAAA,GAAA,CAAA;AAAA,aACF,GAAK,EAAA;AACZ,MAAI,IAAA,EAAE,SAAS,eAAiB,EAAA;AAChC,MAAA,MAAA,CAAO,EAAI,EAAA;AAAA,QACT,KAAO,EAAA,QAAA;AAAA,QACP,KAAA,EAAO,SAAU,CAAA,GAAA,EAAK,0BAA0B,CAAA;AAAA,QAChD,QAAU,EAAA;AAAA,OACX,CAAA;AACD,MAAA;AAAA;AAEF,IAAI,IAAA,MAAA,CAAO,UAAU,SAAW,EAAA;AAC9B,MAAgB,eAAA,CAAA,EAAA,EAAI,aACd,CAAA,cAAA,CAAA,EAAA,EAAA,MAAA,CAAO,IAAO,GAAA;AAAA,QAChB,MAAM,MAAO,CAAA;AAAA,OACf,GAAI,EAHc,CAAA,EAAA;AAAA,QAIlB,QAAA,EAAU,SAAS,MAAM;AAAA,OAC1B,CAAA,CAAA;AACD,MAAA;AAAA;AAEF,IAAI,IAAA,MAAA,CAAO,UAAU,QAAU,EAAA;AAC7B,MAAA,MAAA,CAAO,EAAI,EAAA;AAAA,QACT,KAAO,EAAA,QAAA;AAAA,QACP,KAAA,EAAO,OAAO,KAAS,IAAA,mBAAA;AAAA,QACvB,QAAU,EAAA;AAAA,OACX,CAAA;AACD,MAAA;AAAA;AAEF,IAAA,MAAA,CAAO,EAAI,EAAA;AAAA,MACT,KAAO,EAAA,WAAA;AAAA,MACP,QAAQ,YAAa,CAAA,MAAA,CAAO,GAAO,IAAA,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,MAC5D,QAAU,EAAA;AAAA,KACX,CAAA;AACD,IAAA;AAAA;AAEF,EAAA,MAAA,CAAO,EAAI,EAAA;AAAA,IACT,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA,iEAAA;AAAA,IACP,QAAU,EAAA;AAAA,GACX,CAAA;AACH;AAQO,SAAS,kBAAkB,GAA2B,EAAA;AAC3D,EAAW,KAAA,MAAA,IAAA,IAAQ,iBAAmB,EAAA;AACpC,IAAA,IAAI,KAAK,IAAS,KAAA,QAAA,IAAY,UAAW,CAAA,IAAA,CAAK,KAAK,CAAK,IAAA,OAAA,CAAQ,GAAI,CAAA,IAAA,CAAK,EAAE,CAAK,IAAA,OAAA,CAAQ,GAAI,CAAA,IAAA,CAAK,EAAE,CAAG,EAAA;AACtG,IAAA,IAAI,KAAK,KAAU,KAAA,SAAA,IAAa,KAAK,MAAU,IAAA,CAAC,KAAK,KAAO,EAAA;AAC1D,MAAO,MAAA,CAAA,GAAA,EAAK,KAAK,EAAE,CAAA;AAAA,KACd,MAAA;AACL,MAAA,MAAA,CAAO,KAAK,EAAI,EAAA;AAAA,QACd,KAAO,EAAA,QAAA;AAAA,QACP,KAAO,EAAA,oEAAA;AAAA,QACP,QAAU,EAAA;AAAA,OACX,CAAA;AAAA;AACH;AAEJ;AAGA,mBAAA,CAAoB,iBAAiB,CAAA"}
@@ -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":";;;;;;;;;;;;;;;;;;;AAmBgB,SAAA,cAAA,CAAe,UAA0B,OAAoC,EAAA;AAnB7F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAoBE,EAAM,MAAA,KAAA,GAAQ,SAAS,KAAM,CAAA,MAAA,CAAO,OAAK,WAAY,CAAA,CAAA,EAAG,OAAO,CAAC,CAAA;AAChE,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,IAAI,KAAM,CAAA,MAAA,GAAS,GAAG,CAAK,IAAA,CAAA,EAAG,KAAK,CAAG,EAAA;AAC7C,IAAM,MAAA,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,IAAI,CAAE,CAAA,EAAA;AAAA,MACN,IAAM,EAAA,CAAA,CAAE,IAAS,KAAA,SAAA,GAAY,SAAY,GAAA,MAAA;AAAA,MACzC,KAAO,EAAA,CAAA,CAAE,IAAK,CAAA,IAAA,EAAU,IAAA,MAAA;AAAA,MACxB,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,MAAA,EAAQ,OAAQ,CAAA,CAAA,CAAE,MAAM,CAAA;AAAA,MACxB,QAAA,EAAU,CAAI,GAAA,KAAA,CAAM,MAAS,GAAA,CAAA;AAAA,MAC7B,UAAU,CAAI,GAAA;AAAA,KACf,CAAA;AAAA;AAEH,EAAA,KAAA,MAAW,CAAK,IAAA,CAAA,EAAA,GAAA,QAAA,CAAS,QAAT,KAAA,IAAA,GAAA,EAAA,GAAqB,EAAI,EAAA;AACvC,IAAA,IAAI,CAAC,WAAA,CAAY,CAAG,EAAA,OAAO,CAAG,EAAA;AAC9B,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,IAAI,CAAE,CAAA,EAAA;AAAA,MACN,IAAM,EAAA,SAAA;AAAA,MACN,OAAO,CAAE,CAAA,IAAA;AAAA,MACT,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,MAAQ,EAAA,KAAA;AAAA,MACR,QAAU,EAAA,KAAA;AAAA,MACV,QAAU,EAAA;AAAA,KACX,CAAA;AAAA;AAEH,EAAA,KAAA,MAAW,CAAK,IAAA,CAAA,EAAA,GAAA,QAAA,CAAS,UAAT,KAAA,IAAA,GAAA,EAAA,GAAuB,EAAI,EAAA;AACzC,IAAA,IAAI,CAAC,WAAA,CAAY,CAAG,EAAA,OAAO,CAAG,EAAA;AAC9B,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,IAAI,CAAE,CAAA,EAAA;AAAA,MACN,IAAM,EAAA,OAAA;AAAA,MACN,KAAA,EAAA,CAAO,EAAE,GAAA,CAAA,CAAA,KAAA,KAAF,IAAW,GAAA,EAAA,GAAA,OAAA;AAAA,MAClB,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,MAAQ,EAAA,KAAA;AAAA,MACR,QAAU,EAAA,KAAA;AAAA,MACV,QAAU,EAAA;AAAA,KACX,CAAA;AAAA;AAEH,EAAO,OAAA,IAAA;AACT;AAMO,SAAS,aAAc,CAAA,QAAA,EAA0B,EAAY,EAAA,GAAA,EAAa,OAAwC,EAAA;AACvH,EAAA,MAAM,UAAU,QAAS,CAAA,KAAA,CAAM,GAAI,CAAA,CAAC,GAAG,CAAO,MAAA;AAAA,IAC5C,CAAA;AAAA,IACA;AAAA,GACF,CAAE,CAAE,CAAA,MAAA,CAAO,CAAC;AAAA,IACV;AAAA,GACI,KAAA,WAAA,CAAY,CAAG,EAAA,OAAO,CAAC,CAAA;AAC7B,EAAM,MAAA,EAAA,GAAK,OAAQ,CAAA,SAAA,CAAU,CAAC;AAAA,IAC5B;AAAA,GACF,KAAM,CAAE,CAAA,EAAA,KAAO,EAAE,CAAA;AACjB,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,EAAA,GAAK,GAAG,CAAA;AAC9B,EAAA,IAAI,EAAK,GAAA,CAAA,IAAK,CAAC,KAAA,EAAc,OAAA,QAAA;AAC7B,EAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAA;AAChC,EAAM,MAAA,CAAA,GAAI,OAAQ,CAAA,EAAE,CAAE,CAAA,CAAA;AACtB,EAAA,MAAM,IAAI,KAAM,CAAA,CAAA;AAChB,EAAA,CAAC,KAAM,CAAA,CAAC,CAAG,EAAA,KAAA,CAAM,CAAC,CAAC,CAAI,GAAA,CAAC,KAAM,CAAA,CAAC,CAAG,EAAA,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1C,EAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,IAEL;AAAA,GACF,CAAA;AACF;AACgB,SAAA,gBAAA,CAAiB,UAA0B,EAA4B,EAAA;AACrF,EAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,IAEL,KAAA,EAAO,SAAS,KAAM,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,EAAA,KAAO,EAAK,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACxC,CADwC,CAAA,EAAA;AAAA,MAE3C,MAAA,EAAQ,CAAC,CAAE,CAAA;AAAA,SACT,CAAC;AAAA,GACP,CAAA;AACF;AACgB,SAAA,WAAA,CAAY,UAA0B,EAA4B,EAAA;AAChF,EAAA,OAAO,+DACF,QADE,CAAA,EAAA;AAAA,IAEL,OAAO,QAAS,CAAA,KAAA,CAAM,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE;AAAA,GAAA,CAAA,EACzC,SAAS,QAAW,GAAA;AAAA,IACtB,UAAU,QAAS,CAAA,QAAA,CAAS,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE;AAAA,GACjD,GAAA,EACA,CAAA,EAAA,QAAA,CAAS,UAAa,GAAA;AAAA,IACxB,YAAY,QAAS,CAAA,UAAA,CAAW,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE;AAAA,MACrD,EAAC,CAAA;AAET;AAGO,MAAM,oBAAoB,CAAC;AAAA,EAChC,EAAI,EAAA,KAAA;AAAA,EACJ,KAAO,EAAA,KAAA;AAAA,EACP,CAAG,EAAA;AACL,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,CAAG,EAAA;AACL,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,CAAG,EAAA;AACL,CAAC;AAGe,SAAA,WAAA,CAAY,UAA0B,CAA2B,EAAA;AAC/E,EAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,IAEL,KAAA,EAAO,SAAS,KAAM,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,IAAA,KAAS,SAAY,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACjD,CADiD,CAAA,EAAA;AAAA,MAEpD;AAAA,SACE,CAAC;AAAA,GACP,CAAA;AACF"}
@@ -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) throw new Error(`${action} failed (HTTP ${resp.status}): ${text.slice(0, 200)}`);
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
- throw new Error(`${action} failed: ${stderr.slice(0, 300) || `exit ${exitCode}`}`);
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, token, connector, action, params, (extra == null ? void 0 : extra.job) ? {
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, token, connector, action, params, options);
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
- const resp = await fetch(`${agent}/v1/files/upload?filename=${encodeURIComponent(filename)}`, {
144
- method: "POST",
145
- headers: {
146
- "content-type": blob.type || "application/octet-stream",
147
- authorization: `Bearer ${token}`
148
- },
149
- body: blob
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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"}